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

hua*_*lin 7 typescript

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
Run Code Online (Sandbox Code Playgroud)

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

游乐场

jca*_*alz 5

有关此问题的权威答案,请参阅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) {
Run Code Online (Sandbox Code Playgroud)

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

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

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