Typescript不允许使用in-operator向对象推断类型。
例如,
function getKey<T extends object, U extends string> (obj: T, key: U) {
if (key in obj) {
return obj[key] // Type 'U' cannot be used to index type 'T'.
}
}
Typescript应该认识到 U 是 keyof T ,所以我可以将它用作关键。
如何解决这个问题而无需使用任何?
答案 0 :(得分:2)
您需要将U
声明为扩展keyof T
,以便将其用于索引没有string
索引器的对象。
function getKey<T extends object, U extends keyof T> (obj: T, key: U) {
if (key in obj) {
return obj[key] // Now works!
}
}
由于in
类型防护的PR表明防护会影响T
的类型而不影响密钥的类型,因此您仍需要明确告诉编译器{{1 }} extends U
如果您想将keyof T
保留为U
(我建议您考虑是否真的需要它作为类型参数,而不能只使用string
参数)你可以为函数设置多个签名:
string