首页 > 解决方案 > 为什么任何扩展 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,这项工作作为一个工会。我试图谷歌找到一些解释,但失败了。

游乐场

标签: typescript

解决方案


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

所以any被视为匹配两个分支的通配符。

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

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


推荐阅读