UNPKG

ts-rtcheck

Version:
49 lines (48 loc) 4.16 kB
declare type Primitives = 'boolean' | 'number' | 'object' | 'string' | 'array' | 'undefined' | 'function'; declare type ShiftArr<T> = T extends [_: any, ...rest: infer R] ? R : T extends string ? T : never; declare type Inner<P> = P extends 'string' ? string : P extends 'number' ? number : P extends 'function' ? AnyFunction : P extends 'array' ? unknown[] : P extends 'boolean' ? boolean : P extends 'undefined' ? undefined : P extends 'bigint' ? bigint : P extends 'object' ? Record<string, unknown> : never; declare type Unwrap<T> = T extends any[] ? T[0] : T; declare type PrimitivesTuple = [Primitives, Primitives] | [Primitives, Primitives, Primitives] | [Primitives, Primitives, Primitives, Primitives] | [Primitives, Primitives, Primitives, Primitives, Primitives]; declare type MapPrimitive<P extends any[] | string | any, O = never> = { 0: MapPrimitive<ShiftArr<P>, O | Inner<Unwrap<P>>>; 1: O; 2: Inner<P>; }[P extends [] ? 1 : P extends string ? 2 : 0]; declare type Assert<S> = S extends [infer U] ? Array<{ [W in keyof U]: MapPrimitive<U[W]>; }> : S extends Record<string, Primitives | PrimitivesTuple> ? { [W in keyof S]: MapPrimitive<S[W]>; } : MapPrimitive<[S]>; declare type Keys<T> = T extends undefined ? Record<string, Primitives | PrimitivesTuple> : T extends Array<any> ? Array<Record<string, Primitives | PrimitivesTuple>> : { [K in keyof T]: Primitives | PrimitivesTuple; }; export declare type PowerPartial<T> = { [U in keyof T]?: T[U] extends object ? PowerPartial<T[U]> : T[U]; }; export declare type PowerNonNullable<T> = T extends Array<infer U> ? Array<{ [K in keyof U]-?: U[K] extends Array<infer Q> ? PowerNonNullable<NonNullable<Q>[]> : PowerNonNullable<NonNullable<U[K]>>; }> : { [K in keyof T]-?: PowerNonNullable<NonNullable<T[K]>>; }; declare type FilterObject<T> = T extends Array<infer R> ? { [K in keyof R]: R[K] extends AnyFunction ? R[K] : R extends Record<string, any> ? PowerPartial<R[K]> : R[K]; } : { [K in keyof T]: T[K] extends AnyFunction ? T[K] : T extends Record<string, any> ? PowerPartial<T[K]> : T[K]; }; export declare type isSameType<T, U> = (((a: T) => any) extends (a: U) => any ? true : never) & (((a: U) => any) extends (a: T) => any ? true : never); export declare type UnionToIntersection<U> = (U extends any ? (_: U) => void : never) extends (_: infer I) => void ? I : never; export declare type isUnknownOrUndefined<T> = true extends isSameType<T, unknown> ? true : true extends isSameType<T, undefined> ? true : never; export declare type AnyFunction<T extends any[] = any[], R = any> = (...args: T) => R; declare type Condition<U, T> = U extends undefined ? Assert<T> : U extends Array<infer R> ? Array<FilterObject<R>> : FilterObject<U>; export declare function AssertType<U = undefined, T extends Keys<U> | Primitives | Primitives[] | [Record<string, Primitives | Primitives[]>] = Keys<U>>(obj: unknown, typeShape: T, msg?: string): asserts obj is T extends Primitives ? MapPrimitive<[T]> : T extends Array<infer R> ? R extends Primitives ? Assert<R> : Condition<U, T> : Condition<U, T>; export declare function isType<U = undefined, T extends Keys<U> | Primitives | Primitives[] | [Record<string, Primitives | Primitives[]>] = Keys<U>>(obj: unknown, typeShape: T): obj is T extends Primitives ? MapPrimitive<[T]> : T extends Array<infer R> ? R extends Primitives ? Assert<R> : Condition<U, T> : Condition<U, T>; export declare function isObject(obj: unknown): obj is Record<string, unknown>; export declare function AssertObject(obj: unknown, msg?: string): asserts obj is Record<string, unknown>; export declare function AssertExist<T extends any>(obj: T, msg?: string): asserts obj is NonNullable<T>; export declare function isExist<T extends any>(obj: T): obj is NonNullable<T>; declare type TakeLastType<T, U> = U extends undefined ? T : Omit<T, keyof U> & U; declare type RemoveKey<T, U> = U extends undefined ? T : T & { [K in keyof U]: any; }; export declare function forceCast<T, U = undefined>(obj: any, cb?: AnyFunction<[RemoveKey<T, U>]>): asserts obj is TakeLastType<T, U>; export {};