假设我们有以下
Equal
类型的定义:
type Equal<X, Y> = (X extends Y ? (Y extends X ? true : false) : false);
使用该定义,我们可以创建其他类型:
type Type1 = Equal<boolean, boolean> // => boolean
type Type2 = Equal<boolean, string> // => false
type Type3 = Equal<string, string> // => true
查看 TypeScript 推断的类型,它显示的信息如上面的注释所示。虽然
Type2
和 Type3
按预期工作,但 Type1
的类型会被推断为 boolean
。我希望它是true
。
这是什么原因?
我在在线沙箱(typescriptlang)中使用了 TypeScript v5.6.3。
我相信发生这种情况是因为 TypeScript 在内部将布尔值拆分为联合。因此
boolean
会转换为 true | false
。
一个巧妙的技巧是将值包装在一个元组中,如下所示:
type Equal<X, Y> = [X] extends [Y] ? ([Y] extends [X] ? true : false) : false;
现在结果是正确的。
此外,如果您想检查精确相等,您可以使用此实用程序类型,它使用重载和条件类型:
type Equals<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
T
>() => T extends Y ? 1 : 2
? true
: false;