首页 > 解决方案 > 为什么不能急切地解决这个带有通用 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

解决方案


该问题的答案可能涉及TypeScript 3.3 中引入的错误修复。评估条件类型的新方法的描述是:

对于条件类型T extends U ? X : Y,我们用来确定是否推迟解析条件类型的算法是:

  • 我们决定Y何时T不可分配以U 考虑所有引用TU相关的类型参数(即T绝对不可分配给U),
  • 否则,我们决定X何时T可分配以U 考虑所有类型参数中引用T且不U相关(即T绝对可分配给U),
  • 否则我们推迟解决。

所以它看起来像keyof T extends keyof T ? 1 : 0被推迟了,因为keyof T1不能分配给keyof T2whenT1并且T2是不相关的类型。这种延期并不是完全错误的,但它似乎是一个限制。

事实上,如果我在 TS 3.2.1 中尝试您的代码,它就会急切地解决,所以这是为 TS3.3 引入的更改。

奇怪的是,我对该错误修复的算法描述的阅读看起来也应该适用于您的解决方法。我不确定为什么[keyof T] extends [keyof T]会改变事情,因为[keyof T1]不是绝对可以分配给[keyof T2], ifT1并且T2是不相关的。所以这里仍然存在一些谜团。还没有破解它,所以我可能现在就放弃了。那好吧!


看起来有人报告了这个没有急于解决的确切问题(他们X extends X ? 1 : 0还注意到包装在一个元组中“修复”它),并且该问题被标记为错误,所以也许会得到解决?


好的,希望有帮助;祝你好运!


推荐阅读