import { Ast, AstArray, AstDecorator, AstLiteral, AstObject, AstPrimitive, AstSugarArray, AstSugarLiteral, AstSugarObject, AstUnion, PrimitiveType } from "./ast.js"; export interface PrimitiveTypeMap { [PrimitiveType.Any]: any; [PrimitiveType.Null]: null; [PrimitiveType.Undefined]: undefined; [PrimitiveType.String]: string; [PrimitiveType.Number]: number; [PrimitiveType.Boolean]: boolean; [PrimitiveType.BigInt]: bigint; [PrimitiveType.Symbol]: symbol; } export type EstimateType = T extends StringConstructor ? string : T extends NumberConstructor ? number : T extends BooleanConstructor ? boolean : T extends BigIntConstructor ? bigint : T extends SymbolConstructor ? symbol : T extends ArrayConstructor ? any[] : T extends infer U extends (null | undefined) ? U : T extends infer U extends AstSugarLiteral ? U : T extends AstSugarObject ? { [K in keyof T]: EstimateType; } : T extends AstSugarArray ? EstimateType[] : T extends AstPrimitive ? PrimitiveTypeMap[T[1]] : T extends AstLiteral ? T[1] : T extends AstArray ? EstimateType[] : T extends AstObject ? { [K in keyof T[1]]: EstimateType; } : T extends AstUnion ? EstimateType : T extends AstDecorator ? EstimateType : never;