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
,我们用来确定是否推迟条件类型的解析的算法是:
考虑到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
> T1
和T2
是不相关的类型。这种推迟并不是完全错误的,但它似乎是一个限制。
事实上,如果我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 issue在X extends X ? 1 : 0
没有被急切地解决(他们还注意到用一个元组包装“修复”了它),并且这个问题被标记为一个bug,所以也许它会被解决?
好吧,希望能帮上忙;祝你好运!