Represents an alias to a type with a set of generic parameters that must be mapped prior to use.
Represents something which can be called with arguments and returns a given type.
Represents an enum type which can have multiple variants.
Allows you to map generic types lazily without having to resolve them immediately.
This prevents stack overflows when resolving generic type definitions that reference themselves.
When reducing a type to its structural form, lazy types should be removed.
Struct types are just wrappers around a structural type that provide field information.
Represents a variant type which can optionally have fields.