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
}

游乐场here

最佳答案

这个问题的答案可能涉及到typescript 3.3中引入的a bug fix。评价条件类型的新方法是:
对于条件类型T extends U ? X : Y,我们用来确定是否推迟条件类型的解析的算法是:
考虑到YT相关的所有类型参数(即U绝对不能赋给T),当U不可分配给T时,我们决心U
否则,当X赋值给T时,我们决心将U >考虑到在TU中无关的所有类型参数(即T绝对可赋给U)。
否则我们会推迟决议。
因此,看起来keyof T extends keyof T ? 1 : 0是延迟的,因为keyof T1不可分配给keyof T2 > T1T2是不相关的类型。这种推迟并不是完全错误的,但它似乎是一个限制。
事实上,如果我try your code in TS 3.2.1它是迫不及待地解决,所以这是一个为ts3.3引入的变化。
奇怪的是,我读到的bug修复算法描述看起来也应该适用于你的解决方案。我不知道为什么[keyof T] extends [keyof T]会改变事情,因为如果[keyof T1][keyof T2]是不相关的,那么T1不一定可以指定给T2。所以有些谜团仍然存在。还没来得及破解,所以我可能现在就放弃。哦,好吧!
它看起来也有人reported this exact issueX extends X ? 1 : 0没有被急切地解决(他们还注意到用一个元组包装“修复”了它),并且这个问题被标记为一个bug,所以也许它会被解决?
好吧,希望能帮上忙;祝你好运!

09-11 13:53