✍️ 自己实现一个工具类型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