Here is a type system follows a hierarchy model. any as a super type of all
types, sits on the top, and bottom as a subtype of all types lies on the bottom.
and there are all value types between them.
Here are few primitive types: number, string, boolean and null which
stands for numbers, strings, boolean values and null value.
null type is special and only has single value null, it is helpful to
allow nullable values when combined with other types.
union, array, and object are compound types which allow create new type with
existing types.
union is for values that may have multiple possible types. e.g. a value marked
with union <number, string>, can contains either a number or a string.
array is for a series values sharing same type. e.g. a number list, which can be
represented as number[] / (or maybe array<number>).
object is for a set of values connected with names (also called fields).
All compound types can be composited freely. e.g.:
type T = {
a: number,
b: boolean[],
c: union<boolean?[], { d: string, e: null }>
};