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
## 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