ts-simple-type
Version:
Relationship type checker functions for Typescript types.
380 lines • 16.5 kB
TypeScript
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