type t('M, 'T) = ('T, t'('M, 'T));
and t'('M, 'T) =
| Any(option(Syntax.t('M, unit)))
| Mixed(option(Syntax.t('M, unit)))
| Empty(option(Syntax.t('M, unit)))
| Void(option(Syntax.t('M, unit)))
| Null(option(Syntax.t('M, unit)))
| Number(option(Syntax.t('M, unit)))
| BigInt(option(Syntax.t('M, unit)))
| String(option(Syntax.t('M, unit)))
| Boolean of {
raw: [ `Boolean | `Bool ],
}
| Symbol(option(Syntax.t('M, unit)))
| Exists(option(Syntax.t('M, unit)))
| Nullable(Nullable.t('M, 'T))
| Function(Function.t('M, 'T))
| Component(Component.t('M, 'T))
| Object(Object.t('M, 'T))
| Interface(Interface.t('M, 'T))
| Array(Array.t('M, 'T))
| Conditional(Conditional.t('M, 'T))
| Infer(Infer.t('M, 'T))
| Generic(Generic.t('M, 'T))
| IndexedAccess(IndexedAccess.t('M, 'T))
| OptionalIndexedAccess(OptionalIndexedAccess.t('M, 'T))
| Union(Union.t('M, 'T))
| Intersection(Intersection.t('M, 'T))
| Typeof(Typeof.t('M, 'T))
| Keyof(Keyof.t('M, 'T))
| Renders(Renders.t('M, 'T))
| ReadOnly(ReadOnly.t('M, 'T))
| Tuple(Tuple.t('M, 'T))
| StringLiteral(StringLiteral.t('M))
| NumberLiteral(NumberLiteral.t('M))
| BigIntLiteral(BigIntLiteral.t('M))
| BooleanLiteral(BooleanLiteral.t('M))
| Unknown(option(Syntax.t('M, unit)))
| Never(option(Syntax.t('M, unit)))
| Undefined(option(Syntax.t('M, unit)))
;
and annotation('M, 'T) = ('M, t('M, 'T));
and annotation_or_hint('M, 'T) =
| Missing('T)
| Available(annotation('M, 'T))
;
and component_renders_annotation('M, 'T) =
| MissingRenders('T)
| AvailableRenders('M, Renders.t('M, 'T))
;