UNPKG

ts-simple-type

Version:

Relationship type checker functions for Typescript types.

380 lines 16.5 kB
import * as tsModule from "typescript"; import { Type, TypeChecker, Node, Program } from "typescript"; type SimpleTypeKind = // Primitives types "STRING_LITERAL" | "NUMBER_LITERAL" | "BOOLEAN_LITERAL" | "BIG_INT_LITERAL" | "ES_SYMBOL_UNIQUE" | "STRING" | "NUMBER" | "BOOLEAN" | "BIG_INT" | "ES_SYMBOL" | "NULL" | "UNDEFINED" | "VOID" // TS-specific types // TS-specific types // TS-specific types | "NEVER" | "ANY" | "UNKNOWN" | "ENUM" | "ENUM_MEMBER" | "NON_PRIMITIVE" // Structured types // Structured types // Structured types | "UNION" | "INTERSECTION" // Object types types // Object types types // Object types types | "INTERFACE" | "OBJECT" | "CLASS" // Callable // Callable // Callable | "FUNCTION" | "METHOD" // Generics // Generics // Generics | "GENERIC_ARGUMENTS" | "GENERIC_PARAMETER" | "ALIAS" // Lists // Lists // Lists | "TUPLE" | "ARRAY" // Special types // Special types // Special types | "DATE" | "PROMISE"; type SimpleTypeModifierKind = "EXPORT" | "AMBIENT" | "PUBLIC" | "PRIVATE" | "PROTECTED" | "STATIC" | "READONLY" | "ABSTRACT" | "ASYNC" | "DEFAULT"; // ############################## // Base // ############################## // ############################## // Base // ############################## interface SimpleTypeBase { readonly kind: SimpleTypeKind; readonly name?: string; } // ############################## // Primitive Types // ############################## // ############################## // Primitive Types // ############################## interface SimpleTypeBigIntLiteral extends SimpleTypeBase { readonly kind: "BIG_INT_LITERAL"; readonly value: bigint; } interface SimpleTypeStringLiteral extends SimpleTypeBase { readonly kind: "STRING_LITERAL"; readonly value: string; } interface SimpleTypeNumberLiteral extends SimpleTypeBase { readonly kind: "NUMBER_LITERAL"; readonly value: number; } interface SimpleTypeBooleanLiteral extends SimpleTypeBase { readonly kind: "BOOLEAN_LITERAL"; readonly value: boolean; } interface SimpleTypeString extends SimpleTypeBase { readonly kind: "STRING"; } interface SimpleTypeNumber extends SimpleTypeBase { readonly kind: "NUMBER"; } interface SimpleTypeBoolean extends SimpleTypeBase { readonly kind: "BOOLEAN"; } interface SimpleTypeBigInt extends SimpleTypeBase { readonly kind: "BIG_INT"; } interface SimpleTypeESSymbol extends SimpleTypeBase { readonly kind: "ES_SYMBOL"; } interface SimpleTypeESSymbolUnique extends SimpleTypeBase { readonly kind: "ES_SYMBOL_UNIQUE"; readonly value: string; } // ############################## // TS-specific types // ############################## // ############################## // TS-specific types // ############################## interface SimpleTypeNull extends SimpleTypeBase { readonly kind: "NULL"; } interface SimpleTypeNever extends SimpleTypeBase { readonly kind: "NEVER"; } interface SimpleTypeUndefined extends SimpleTypeBase { readonly kind: "UNDEFINED"; } interface SimpleTypeAny extends SimpleTypeBase { readonly kind: "ANY"; } interface SimpleTypeUnknown extends SimpleTypeBase { readonly kind: "UNKNOWN"; } interface SimpleTypeVoid extends SimpleTypeBase { readonly kind: "VOID"; } interface SimpleTypeNonPrimitive extends SimpleTypeBase { readonly kind: "NON_PRIMITIVE"; } interface SimpleTypeEnumMember extends SimpleTypeBase { readonly kind: "ENUM_MEMBER"; readonly fullName: string; readonly name: string; readonly type: SimpleTypePrimitive; } interface SimpleTypeEnum extends SimpleTypeBase { readonly name: string; readonly kind: "ENUM"; readonly types: SimpleTypeEnumMember[]; } // ############################## // Structure Types // ############################## // ############################## // Structure Types // ############################## interface SimpleTypeUnion extends SimpleTypeBase { readonly kind: "UNION"; readonly types: SimpleType[]; } interface SimpleTypeIntersection extends SimpleTypeBase { readonly kind: "INTERSECTION"; readonly types: SimpleType[]; } // ############################## // Object Types // ############################## // ############################## // Object Types // ############################## interface SimpleTypeMember { readonly optional: boolean; readonly type: SimpleType; readonly modifiers?: SimpleTypeModifierKind[]; } interface SimpleTypeMemberNamed extends SimpleTypeMember { readonly name: string; } interface SimpleTypeObjectTypeBase extends SimpleTypeBase { readonly members?: SimpleTypeMemberNamed[]; readonly ctor?: SimpleTypeFunction; readonly call?: SimpleTypeFunction; readonly typeParameters?: SimpleTypeGenericParameter[]; readonly indexType?: { ["STRING"]?: SimpleType; ["NUMBER"]?: SimpleType; }; } interface SimpleTypeInterface extends SimpleTypeObjectTypeBase { readonly kind: "INTERFACE"; } interface SimpleTypeClass extends SimpleTypeObjectTypeBase { readonly kind: "CLASS"; } interface SimpleTypeObject extends SimpleTypeObjectTypeBase { readonly kind: "OBJECT"; } // ############################## // Callable // ############################## // ############################## // Callable // ############################## interface SimpleTypeFunctionParameter { readonly name: string; readonly type: SimpleType; readonly optional: boolean; readonly rest: boolean; readonly initializer: boolean; } interface SimpleTypeFunction extends SimpleTypeBase { readonly kind: "FUNCTION"; readonly parameters?: SimpleTypeFunctionParameter[]; readonly typeParameters?: SimpleTypeGenericParameter[]; readonly returnType?: SimpleType; } interface SimpleTypeMethod extends SimpleTypeBase { readonly kind: "METHOD"; readonly parameters: SimpleTypeFunctionParameter[]; readonly typeParameters?: SimpleTypeGenericParameter[]; readonly returnType: SimpleType; } // ############################## // Generics // ############################## // ############################## // Generics // ############################## interface SimpleTypeGenericArguments extends SimpleTypeBase { readonly kind: "GENERIC_ARGUMENTS"; readonly name?: undefined; readonly target: SimpleType; readonly typeArguments: SimpleType[]; } interface SimpleTypeGenericParameter extends SimpleTypeBase { readonly name: string; readonly kind: "GENERIC_PARAMETER"; readonly default?: SimpleType; } interface SimpleTypeAlias extends SimpleTypeBase { readonly kind: "ALIAS"; readonly name: string; readonly target: SimpleType; readonly typeParameters?: SimpleTypeGenericParameter[]; } // ############################## // Lists // ############################## // ############################## // Lists // ############################## interface SimpleTypeTuple extends SimpleTypeBase { readonly kind: "TUPLE"; readonly members: SimpleTypeMember[]; readonly rest?: boolean; } interface SimpleTypeArray extends SimpleTypeBase { readonly kind: "ARRAY"; readonly type: SimpleType; } // ############################## // Special Types // ############################## // ############################## // Special Types // ############################## interface SimpleTypeDate extends SimpleTypeBase { readonly kind: "DATE"; } interface SimpleTypePromise extends SimpleTypeBase { readonly kind: "PROMISE"; readonly type: SimpleType; } type SimpleType = SimpleTypeBigIntLiteral | SimpleTypeEnumMember | SimpleTypeEnum | SimpleTypeClass | SimpleTypeFunction | SimpleTypeObject | SimpleTypeInterface | SimpleTypeTuple | SimpleTypeArray | SimpleTypeUnion | SimpleTypeIntersection | SimpleTypeStringLiteral | SimpleTypeNumberLiteral | SimpleTypeBooleanLiteral | SimpleTypeESSymbolUnique | SimpleTypeString | SimpleTypeNumber | SimpleTypeBoolean | SimpleTypeBigInt | SimpleTypeESSymbol | SimpleTypeNull | SimpleTypeUndefined | SimpleTypeNever | SimpleTypeAny | SimpleTypeMethod | SimpleTypeVoid | SimpleTypeNonPrimitive | SimpleTypePromise | SimpleTypeUnknown | SimpleTypeAlias | SimpleTypeDate | SimpleTypeGenericArguments | SimpleTypeGenericParameter; // Collect all values on place. This is a map so Typescript will complain if we forget any kind. // Collect all values on place. This is a map so Typescript will complain if we forget any kind. // Collect all values on place. This is a map so Typescript will complain if we forget any kind. // Primitive, literal type SimpleTypeLiteral = SimpleTypeBigIntLiteral | SimpleTypeBooleanLiteral | SimpleTypeStringLiteral | SimpleTypeNumberLiteral | SimpleTypeESSymbolUnique; declare const LITERAL_TYPE_KINDS: SimpleTypeKind[]; declare function isSimpleTypeLiteral(type: SimpleType): type is SimpleTypeLiteral; // Primitive // Primitive type SimpleTypePrimitive = SimpleTypeLiteral | SimpleTypeString | SimpleTypeNumber | SimpleTypeBoolean | SimpleTypeBigInt | SimpleTypeNull | SimpleTypeUndefined | SimpleTypeESSymbol; declare const PRIMITIVE_TYPE_KINDS: SimpleTypeKind[]; declare function isSimpleTypePrimitive(type: SimpleType): type is SimpleTypePrimitive; // All kinds // All kinds declare const SIMPLE_TYPE_KINDS: SimpleTypeKind[]; declare function isSimpleType(type: unknown): type is SimpleType; type SimpleTypeKindMap = { STRING_LITERAL: SimpleTypeStringLiteral; NUMBER_LITERAL: SimpleTypeNumberLiteral; BOOLEAN_LITERAL: SimpleTypeBooleanLiteral; BIG_INT_LITERAL: SimpleTypeBigIntLiteral; ES_SYMBOL_UNIQUE: SimpleTypeESSymbolUnique; STRING: SimpleTypeString; NUMBER: SimpleTypeNumber; BOOLEAN: SimpleTypeBoolean; BIG_INT: SimpleTypeBigInt; ES_SYMBOL: SimpleTypeESSymbol; NULL: SimpleTypeNull; UNDEFINED: SimpleTypeUndefined; VOID: SimpleTypeVoid; NEVER: SimpleTypeNever; ANY: SimpleTypeAny; UNKNOWN: SimpleTypeUnknown; ENUM: SimpleTypeEnum; ENUM_MEMBER: SimpleTypeEnumMember; NON_PRIMITIVE: SimpleTypeNonPrimitive; UNION: SimpleTypeUnion; INTERSECTION: SimpleTypeIntersection; INTERFACE: SimpleTypeInterface; OBJECT: SimpleTypeObject; CLASS: SimpleTypeClass; FUNCTION: SimpleTypeFunction; METHOD: SimpleTypeMethod; GENERIC_ARGUMENTS: SimpleTypeGenericArguments; GENERIC_PARAMETER: SimpleTypeGenericParameter; ALIAS: SimpleTypeAlias; TUPLE: SimpleTypeTuple; ARRAY: SimpleTypeArray; DATE: SimpleTypeDate; PROMISE: SimpleTypePromise; }; declare function setTypescriptModule(ts: typeof tsModule): void; declare function getTypescriptModule(): typeof tsModule; interface SimpleTypeBaseOptions { } interface SimpleTypeComparisonOptions extends SimpleTypeBaseOptions { strict?: boolean; strictNullChecks?: boolean; strictFunctionTypes?: boolean; noStrictGenericChecks?: boolean; isAssignable?: (typeA: SimpleType, typeB: SimpleType, options: SimpleTypeComparisonOptions) => boolean | undefined | void; debug?: boolean; debugLog?: (text: string) => void; cache?: WeakMap<SimpleType, WeakMap<SimpleType, boolean>>; maxDepth?: number; maxOps?: number; } interface SimpleTypeKindComparisonOptions extends SimpleTypeBaseOptions { matchAny?: boolean; } /** * Tests a type is assignable to a primitive type. * @param type The type to test. * @param options */ declare function isAssignableToPrimitiveType(type: SimpleType): boolean; declare function isAssignableToPrimitiveType(type: Type | SimpleType, checker: TypeChecker): boolean; /** * Tests if "typeA = typeB" in strict mode. * @param typeA - Type A * @param typeB - Type B * @param checkerOrOptions * @param options */ declare function isAssignableToType(typeA: SimpleType, typeB: SimpleType, options?: SimpleTypeComparisonOptions): boolean; declare function isAssignableToType(typeA: SimpleType | Type | Node, typeB: SimpleType | Type | Node, checker: TypeChecker | Program, options?: SimpleTypeComparisonOptions): boolean; declare function isAssignableToType(typeA: Type | Node, typeB: Type | Node, checker: TypeChecker | Program, options?: SimpleTypeComparisonOptions): boolean; declare function isAssignableToType(typeA: Type | Node | SimpleType, typeB: Type | Node | SimpleType, checker: Program | TypeChecker, options?: SimpleTypeComparisonOptions): boolean; /** * Tests if a type is assignable to a value. * Tests "type = value" in strict mode. * @param type The type to test. * @param value The value to test. */ declare function isAssignableToValue(type: SimpleType, value: unknown): boolean; declare function isAssignableToValue(type: SimpleType | Type | Node, value: unknown, checker: TypeChecker | Program): boolean; /** * Checks if a simple type kind is assignable to a type. * @param type The type to check * @param kind The simple type kind to check * @param kind The simple type kind to check * @param checker TypeCHecker if type is a typescript type * @param options Options */ declare function isAssignableToSimpleTypeKind(type: SimpleType, kind: SimpleTypeKind | SimpleTypeKind[], options?: SimpleTypeKindComparisonOptions): boolean; declare function isAssignableToSimpleTypeKind(type: Type | SimpleType, kind: SimpleTypeKind | SimpleTypeKind[], checker: TypeChecker, options?: SimpleTypeKindComparisonOptions): boolean; interface ToSimpleTypeOptions { eager?: boolean; cache?: WeakMap<Type, SimpleType>; } /** * Converts a Typescript type to a "SimpleType" * @param type The type to convert. * @param checker * @param options */ declare function toSimpleType(type: SimpleType, checker?: TypeChecker, options?: ToSimpleTypeOptions): SimpleType; declare function toSimpleType(type: Node, checker: TypeChecker, options?: ToSimpleTypeOptions): SimpleType; declare function toSimpleType(type: Type, checker: TypeChecker, options?: ToSimpleTypeOptions): SimpleType; declare function toSimpleType(type: Type | Node | SimpleType, checker: TypeChecker, options?: ToSimpleTypeOptions): SimpleType; /** * Returns a string representation of a given type. * @param simpleType */ declare function typeToString(simpleType: SimpleType): string; declare function typeToString(type: SimpleType | Type, checker: TypeChecker): string; type SerializedSimpleTypeWithRef<ST = SimpleType> = { [key in keyof ST]: ST[key] extends SimpleType ? string : SerializedSimpleTypeWithRef<ST[key]>; }; interface SerializedSimpleType { typeMap: Record<number, SerializedSimpleTypeWithRef>; type: number; } /** * Deserialize a serialized type into a SimpleType * @param serializedSimpleType */ /** * Deserialize a serialized type into a SimpleType * @param serializedSimpleType */ declare function deserializeSimpleType(serializedSimpleType: SerializedSimpleType): SimpleType; /** * Serialize a SimpleType * @param simpleType */ /** * Serialize a SimpleType * @param simpleType */ declare function serializeSimpleType(simpleType: SimpleType): SerializedSimpleType; declare function validateType(type: SimpleType, callback: (simpleType: SimpleType) => boolean | undefined | void): boolean; export { SimpleTypeKind, SimpleTypeModifierKind, SimpleTypeBase, SimpleTypeBigIntLiteral, SimpleTypeStringLiteral, SimpleTypeNumberLiteral, SimpleTypeBooleanLiteral, SimpleTypeString, SimpleTypeNumber, SimpleTypeBoolean, SimpleTypeBigInt, SimpleTypeESSymbol, SimpleTypeESSymbolUnique, SimpleTypeNull, SimpleTypeNever, SimpleTypeUndefined, SimpleTypeAny, SimpleTypeUnknown, SimpleTypeVoid, SimpleTypeNonPrimitive, SimpleTypeEnumMember, SimpleTypeEnum, SimpleTypeUnion, SimpleTypeIntersection, SimpleTypeMember, SimpleTypeMemberNamed, SimpleTypeObjectTypeBase, SimpleTypeInterface, SimpleTypeClass, SimpleTypeObject, SimpleTypeFunctionParameter, SimpleTypeFunction, SimpleTypeMethod, SimpleTypeGenericArguments, SimpleTypeGenericParameter, SimpleTypeAlias, SimpleTypeTuple, SimpleTypeArray, SimpleTypeDate, SimpleTypePromise, SimpleType, SimpleTypeLiteral, LITERAL_TYPE_KINDS, isSimpleTypeLiteral, SimpleTypePrimitive, PRIMITIVE_TYPE_KINDS, isSimpleTypePrimitive, SIMPLE_TYPE_KINDS, isSimpleType, SimpleTypeKindMap, setTypescriptModule, getTypescriptModule, SimpleTypeBaseOptions, SimpleTypeComparisonOptions, SimpleTypeKindComparisonOptions, isAssignableToPrimitiveType, isAssignableToType, isAssignableToValue, isAssignableToSimpleTypeKind, ToSimpleTypeOptions, toSimpleType, typeToString, SerializedSimpleTypeWithRef, SerializedSimpleType, deserializeSimpleType, serializeSimpleType, validateType }; //# sourceMappingURL=index.cjs.d.ts.map