pub enum TypeInfo {
Array { braces: ContainedSpan, access: Option<TokenReference>, type_info: Box<TypeInfo> },
Basic(TokenReference),
String(TokenReference), // Singleton string: "hello"
Boolean(TokenReference), // Singleton boolean: true
Callback { generics: Option<GenericDeclaration>, parentheses: ContainedSpan, arguments: Punctuated<TypeArgument>, arrow: TokenReference, return_type: Box<TypeInfo> },
Generic { base: TokenReference, arrows: ContainedSpan, generics: Punctuated<TypeInfo> },
GenericPack { name: TokenReference, ellipsis: TokenReference },
Intersection(TypeIntersection),
Module { module: TokenReference, punctuation: TokenReference, type_info: Box<IndexedTypeInfo> },
Optional { base: Box<TypeInfo>, question_mark: TokenReference },
Table { braces: ContainedSpan, fields: Punctuated<TypeField> },
Typeof { typeof_token: TokenReference, parentheses: ContainedSpan, inner: Box<Expression> },
Tuple { parentheses: ContainedSpan, types: Punctuated<TypeInfo> },
Union(TypeUnion),
Variadic { ellipsis: TokenReference, type_info: Box<TypeInfo> },
VariadicPack { ellipsis: TokenReference, name: TokenReference },
}