为什么 Typescript 推断特定类型,而逻辑上它应该是不同的类型

问题描述 投票:0回答:1

假设我们有以下

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 type-inference
1个回答
0
投票

我相信发生这种情况是因为 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;
© www.soinside.com 2019 - 2024. All rights reserved.