The Sorbet syntax for type annotations representing arrays, hash maps, and other containers defined in the Ruby standard library looks different from other [class types](/docs/class-types) despite the fact that Ruby uses classes to represent these values, too. Here's the syntax Sorbet uses:| sorbet.org
**Exhaustiveness checking** is a feature of a language where the type checker guarantees that the programmer has covered all cases. It can be super useful at catching pesky edge cases before they become bugs, and Sorbet supports it as a first class feature.| sorbet.org
## Why does Sorbet think this is `nil`? I just checked that it's not!| sorbet.org
Classes are also values in Ruby. Sorbet has two ways to describe the type of these class objects: `T.class_of(...)` and `T::Class[...]`.| sorbet.org
Sorbet does not (yet?) have| blog.jez.io
Sorbet supports sealed classes. Sealed classes restrict who's allowed to subclass a class. This is a considerably advanced feature, but it's also considerably powerful. That being said, if you're already familiar with the concept, here's what the syntax looks like in Sorbet:| sorbet.org
Sorbet supports marking methods, classes, and modules "final", which limits how they can be overridden and extended, making some patterns easier to reason about and depend on.| sorbet.org
Sorbet implements a **control flow-sensitive** type system. It models control| sorbet.org
| sorbet.org
Abstract singleton class methods do not belong in a well-behaved type system. Sorbet allows them anyways, which causes problems. Here's why they're bad and what to do instead.| blog.jez.io
A solid grasp of the tools Ruby provides for inheritance, like include and extend, helps write better code. But the concepts are often learned hastily—this post revisits them in depth.| blog.jez.io
Sorbet has syntax for creating generic methods, classes, and interfaces.| sorbet.org
Sorbet supports method override checking. These checks are implemented as `sig`| sorbet.org
Intersection types are how we overlap two types, declaring that an expression| sorbet.org
A series of pictures which show how Rails's ActiveSupport::Concern works to redefine what inheritance means in Ruby.| blog.jez.io
RBI files are "Ruby Interface" files. Sorbet uses RBI files to learn about| sorbet.org
The straightforward attempt at writing a Sorbet signature for a method that calls `klass.new` doesn't work. The strategy that does work uses abstract methods, and so I'd like to walk through an extended example showing how to get such code to typecheck.| blog.jez.io