typescript - 为什么不能急切地解决这个带有通用 keyof 的条件?
问题描述
function broken<T>(value: T) {
type Test = keyof T extends keyof T ? 1 : 0
}
为什么不能Test
在上面的例子中急切地解决1
?对于应该为我回答这个问题的编译器,我有一些不明白的地方。
有趣的是,有一个解决方法:
function workaround<T>(value: T) {
type Test = [keyof T] extends [keyof T] ? 1 : 0
}
这里的游乐场
解决方案
该问题的答案可能涉及TypeScript 3.3 中引入的错误修复。评估条件类型的新方法的描述是:
对于条件类型
T extends U ? X : Y
,我们用来确定是否推迟解析条件类型的算法是:
- 我们决定
Y
何时T
不可分配以U
考虑所有引用T
和U
相关的类型参数(即T
绝对不可分配给U
),- 否则,我们决定
X
何时T
可分配以U
考虑所有类型参数中引用T
且不U
相关(即T
绝对可分配给U
),- 否则我们推迟解决。
所以它看起来像keyof T extends keyof T ? 1 : 0
被推迟了,因为keyof T1
不能分配给keyof T2
whenT1
并且T2
是不相关的类型。这种延期并不是完全错误的,但它似乎是一个限制。
事实上,如果我在 TS 3.2.1 中尝试您的代码,它就会急切地解决,所以这是为 TS3.3 引入的更改。
奇怪的是,我对该错误修复的算法描述的阅读看起来也应该适用于您的解决方法。我不确定为什么[keyof T] extends [keyof T]
会改变事情,因为[keyof T1]
不是绝对可以分配给[keyof T2]
, ifT1
并且T2
是不相关的。所以这里仍然存在一些谜团。还没有破解它,所以我可能现在就放弃了。那好吧!
看起来有人报告了这个没有急于解决的确切问题(他们X extends X ? 1 : 0
还注意到包装在一个元组中“修复”它),并且该问题被标记为错误,所以也许会得到解决?
好的,希望有帮助;祝你好运!
推荐阅读
- java - 如何通过传递参数在c#中动态编译和执行java代码文件
- react-native - 如何正确重置导航状态?
- sql - SQL 查询以允许每个项目的最新数据集
- sql-server - 限制在 SSMS / Azure Data Studio 中保存查询结果?
- android - 用于 React-Native 的 Android 中带有文本的居中图标
- typescript - 在 Typescript 中将操作的原始类型(字符串)设置为索引签名
- bash - 如何使用在 Windows 上运行的 bash 脚本将文本打印为“大 ascii”文本艺术
- vba - 如何使用不同的变量在 VBA 中自动填充范围
- java - windowbuilder 组合框 actionPerformed 问题
- bash - 如何从节点获取文件的内容并将其保存在 pod 内的变量中?