为什么任何扩展X?A:B给A打字稿中的B?

type TestAny = any extends 'a' ? 1 : 2 // => 1 | 2  why??? how to understand?
type TestUnknown = unknown extends 'a' ? 1 : 2 // => 2
type TestStringA = 'a' extends 'a' ? 1 : 2 // => 1

type SomeUnion = 'a' | 'b'
type UnionDistribute<T> = T extends 'a' ? 1 : 2
type t0 = UnionDistribute<SomeUnion>  // => 1 | 2  // any work like an union

为什么any extends 'a' ? 1: 21 | 2,这项工作作为一个工会。我试图谷歌寻找一些解释但失败了。

游乐场

回答

有关此问题的权威答案,请参阅microsoft/TypeScript#40049,尽管在我看来它并没有说明根本原因。

特别是这个评论:

@jack-williams在 2020 年 8 月 14 日发表评论:

这在源代码之外没有特别详细的记录,但在检查器中,您会在相关位置找到:

// Return union of trueType and falseType for 'any' since it matches anything
if (checkType.flags & TypeFlags.Any) {

Soany被视为匹配两个分支的通配符。

目前,您可以在第 15239 行找到代码(GitHub 不会让您链接到如此大的文件中的特定行),并且在microsoft/TypeScript#21316中的此提交中引入了该代码,这是实现条件类型的拉取请求首先。所以只要条件类型存在,就一直是这样。

这是您最接近“为什么”发生这种情况的原因。官方回答是“因为它匹配任何东西”。


以上是为什么任何扩展X?A:B给A打字稿中的B?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>