参数类型为T和K的泛型函数,其中K是T的键和数组?

时间:2018-10-16 14:26:09

标签: function typescript generics

在打字稿中,可以声明一个需要一个类型及其键之一作为参数的函数:

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]);   
}

问题:

是否有通用类型Kextends keyof T并且是数组? (换句话说:K必须是数组和类型为T的键)

用例示例:

function lengthLogger<T, K /*extends keyof T and is array*/>(object: T, key: K){
  console.log(object[key].length)     
}

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。最好的方法是声明TK

的记录。
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