Jack Q
2024-08-19
来自广东
// 测试用例及预期 class MyClass {} // any | never type T0_0 = To<any, [string, number, 'a'|'b'], MyClass>; // unknown type T0_1 = To<never, [string, number, 'a'|'b'], MyClass>;// unknown // union type T1_0 = To<Constructor | Callable, [string, number, 'a'|'b'], MyClass>; // Callable | Constructor type T1_1 = To<Constructor | Callable, [string, number, 'a'|'b'], 1>; // Callable type T1_2 = To<Constructor | Callable, [string, number, 'a'|'b'], Boolean>; // Callable | Constructor type T1_3 = To<Constructor | Callable, [string, number, 'a'|'b'], symbol>; // Callable type T1_4 = To<Constructor | Callable, [string, number, 'a'|'b']>; // Callable type T1_5 = To<Constructor | Callable, [string, number, 'a'|'b'], undefined>; // Callable // Callable type T2_0 = To<Callable, [string, number, 'a'|'b']>; // Callable type T2_1 = To<Callable, [string, number, 'a'|'b'], undefined>; // Callable type T2_2 = To<Callable, [string, number, 'a'|'b'], MyClass>; // Callable type T2_3 = To<Callable, [string, number, 'a'|'b'], 1>; // Callable type T2_4 = To<Callable, [string, number, 'a'|'b'], Boolean>; // Callable type T2_5 = To<Callable, [string, number, 'a'|'b'], symbol>; // Callable // Constructor type T3_0 = To<Constructor, [string, number, 'a'|'b']>; // never type T3_1 = To<Constructor, [string, number, 'a'|'b'], undefined>; // never type T3_2 = To<Constructor, [string, number, 'a'|'b'], MyClass>; // Constructor type T3_3 = To<Constructor, [string, number, 'a'|'b'], 1>; // never; literal 1 is not object type T3_4 = To<Constructor, [string, number, 'a'|'b'], Boolean>; // Constructor type T3_5 = To<Constructor, [string, number, 'a'|'b'], symbol>; // literal symbol is not object type T3_6 = To<Constructor, [string, number, 'a'|'b'], Symbol>; // Constructor
展开
Jack Q
2024-08-19
来自广东
type IsAny<T> = 0 extends 1 & T ? true : false; type IsNever<T> = [T] extends [never] ? true : false; type IsVoidOrUndefined<T> = [T] extends [void] ? NotAnyNever<T> : false; type IsUnion<T> = T[] extends (infer U)[] ? [U] extends [infer t] ? ([T] extends [t] ? false : true) : never : never; type IsInterface<T> = [T] extends [object] ? NotAnyNever<T> : false; type Not<T extends boolean> = true extends T ? false : true; type NotAnyNever<T> = false extends IsAny<T> ? Not<IsNever<T>> : false; type NotVoidUndefined<T> = false extends IsVoidOrUndefined<T> ? true : false; type Callable = 0; type Constructor = 1; type Gen<Type extends Callable|Constructor, Args extends any[], Ret = void> = IsUnion<Type> extends (false | never) ? IsInterface<Ret> extends true ? Table<Type, Args, Ret> : Type extends Constructor ? never : Table<Type, Args, Ret> : Gen<Type, Args, Ret>; type Table<Type extends Callable|Constructor, Args extends any[], Ret = void> = { 0: (...arg: [...Args]) => Ret; 1: { new (...arg: [...Args]): Ret; readonly prototype: Ret; }; }[Type] type To<Type extends Callable|Constructor, Args extends any[], Ret = void> = NotAnyNever<Type> extends true ? Gen<Type, Args, Ret> : unknown;
展开