typescript - 为什么任何扩展 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: 2
给1 | 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) {
所以
any
被视为匹配两个分支的通配符。
目前你可以在第 15239 行找到代码(GitHub 不会让你链接到像这个一样大的文件中的特定行),它是在microsoft/TypeScript#21316的这个提交中引入的,实现条件类型的拉取请求首先。所以只要条件类型存在,它就一直是这样。
这是您最接近“为什么”会发生这种情况的原因。官方的回答是“因为它匹配任何东西”。
推荐阅读
- mysql - 如何在 MySQL 工作台中重新启动 MySQL 本地实例?
- php - 在 MySQL 和 Laravel 中使用条件连接嵌套表
- windows - 如何在 Windows 10 的 Apache NiFi 中执行 Linux bash 命令
- python - Typehints 索引器中的 Python 表达式
- javascript - 使用 JavaScript 将十进制时间转换为人类可读的格式
- jquery - Typescript catch bootstrap 4 模态打开事件
- angular - 类型“HTML 集合”必须有一个在指令中返回迭代器的“[Symbol.iterator]()”方法
- javascript - 将 settings.json 文件与 Node.js 和 pkg 一起使用
- tmux - 有没有办法自动化在 tmux 中创建会话和窗格的过程
- python - Python 中的异常中断