在打字稿中,可以声明一个需要一个类型及其键之一作为参数的函数:
function foo<T, K extends keyof T>(object: T, key: K)
然后,您可以在函数主体中获取或设置object
的键值,甚至可以提取键的类型(T[k]
):
function setter<T, K extends keyof T>(object: T, key: K){
return (value: T[K]) => {
obj[key] = value;
};
}
function logger<T, K extends keyof T>(object: T, key: K){
console.log(obj[key]);
}
问题:
是否有通用类型K
和extends keyof T
并且是数组?
(换句话说:K
必须是数组和类型为T
的键)
用例示例:
function lengthLogger<T, K /*extends keyof T and is array*/>(object: T, key: K){
console.log(object[key].length)
}
答案 0 :(得分:1)
有几种方法可以做到这一点。最好的方法是声明T
为K
any[]
这可以确保呼叫站点和声明类型的安全性。
您会发现的另一种选择是使用条件类型在function lengthLogger<T extends Record<K, any[]>, K extends keyof T>(object: T, key: K) {
console.log(object[key].length)
}
lengthLogger({
foo: "",
bar: ["", ""]
}, 'bar')
lengthLogger({
foo: "",
bar: ["", ""]
}, 'foo') // Error
中仅提取特定类型的属性。这对于呼叫站点效果很好,但是您需要声明的类型断言:
K