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: 2给1 | 2,这项工作作为一个工会。我试图谷歌寻找一些解释但失败了。
有关此问题的权威答案,请参阅microsoft/TypeScript#40049,尽管在我看来它并没有说明根本原因。
特别是这个评论:
@jack-williams在 2020 年 8 月 14 日发表评论:
这在源代码之外没有特别详细的记录,但在检查器中,您会在相关位置找到:
Run Code Online (Sandbox Code Playgroud)// Return union of trueType and falseType for 'any' since it matches anything if (checkType.flags & TypeFlags.Any) {So
any被视为匹配两个分支的通配符。
目前,您可以在第 15239 行找到代码(GitHub 不会让您链接到如此大的文件中的特定行),并且在microsoft/TypeScript#21316中的此提交中引入了该代码,这是实现条件类型的拉取请求首先。所以只要条件类型存在,就一直是这样。
这是您最接近“为什么”发生这种情况的原因。官方回答是“因为它匹配任何东西”。
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |