TS自定义工具类型

410 阅读1分钟

✍️ 自己实现一个工具类型Equal<S, T> —— 可以用于区分 S 和 T 是否是相同的类型:

代码如下:

// 此处需要区分出any,巧妙使用只有 any 与任意非extends左侧的类型(如0)交叉(如1)才会成为父类型
// 只有 any 满足与任何类型交叉得到的都是 any
type IsAny<T> = 0 extends (1 & T) ? true : false;   // 这里只有传入any才会返回true
type Equal<S, T> = IsAny<S> extends true   // 注意这里仍然区分不了大Object和小object类型
  ? IsAny<T> extends true
    ? true
    : false
  : IsAny<T> extends true
  ? false
  : [S] extends [T]
  ? [T] extends [S]
    ? true
    : false
  : false;
type Example1 = EqualV3<1 | number & {}, number>; // true but false got
type Example2 = EqualV3<never, never>; // true
type Example4 = EqualV3<any, any>; // true
type Example3 = EqualV3<any, number>; // false
type Example5 = EqualV3<never, any>; // false