打字稿:为什么 A 扩展 B 和 B 扩展 A 并不意味着 A 等于 B?

时间:2021-07-08 03:20:15

标签: typescript typescript-generics

我想找一个泛型类型来判断类型A是否等于类型B。

类似的东西。

type Equal<A, B> = A === B ? true : false;

但是打字稿中没有 === 运算符。

我已经检查了这个 issue 并找到了一个很好的实现。

让我们先看看一些类型。

type test18 = boolean extends false ? true : false; // return false as expected
type test19 = false extends boolean ? true : false; // return true as expected
type test20 = false extends boolean ? boolean extends false ? true : false : false; // return false as expected
type test21 = boolean extends false ? false extends boolean ? true : false : false; // return false as expected

我的问题是为什么这段代码不起作用?

type Equal<A, B> = A extends B ? B extends A ? true : false : false;

type test1 = Equal<boolean, false>; // why return boolean rather than false

为什么 test1 是 boolean 而不是 false

还有其他情况也行不通。

type test9 = Equal<any, string>; // boolean
type test10 = Equal<any, number>; // boolean
type test12 = Equal<string | number, number>; // boolean
type test121 = Equal<string | number, string | number>; // boolean
type test125 = Equal<{x:number} | {y:string}, {x:number} | {y:string}>; // boolean

type test13 = Equal<never, number>; // never
type test14 = Equal<never, never>; // never
type test15 = Equal<never, unknown>; // never

playground link

0 个答案:

没有答案