使用in运算符键入推断

时间:2018-01-25 17:21:57

标签: typescript casting

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 ,所以我可以将它用作关键。

如何解决这个问题而无需使用任何

1 个答案:

答案 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