Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 参数类型为T和K的泛型函数,其中K是T和数组的键?_Function_Typescript_Generics - Fatal编程技术网

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

Function 参数类型为T和K的泛型函数,其中K是T和数组的键?,function,typescript,generics,Function,Typescript,Generics,在typescript中,可以声明一个函数,该函数需要一个类型及其一个键作为参数: function foo<T, K extends keyof T>(object: T, key: K) 问题: function lengthLogger<T, K /*extends keyof T and is array*/>(object: T, key: K){ console.log(object[key].length) } 是否有可能将泛型类型K扩展为

在typescript中,可以声明一个函数,该函数需要一个类型及其一个键作为参数:

function foo<T, K extends keyof T>(object: T, key: K)
问题:

function lengthLogger<T, K /*extends keyof T and is array*/>(object: T, key: K){
  console.log(object[key].length)     
}
是否有可能将泛型类型
K
扩展为一个数组? (换句话说:
K
必须是数组和
T
类型的键)

示例用例:

function lengthLogger<T, K /*extends keyof T and is array*/>(object: T, key: K){
  console.log(object[key].length)     
}
函数长度记录器(对象:T,键:K){
console.log(对象[key].length)
}

有几种方法可以做到这一点。最好的方法是将
T
声明为
any[]的
K
记录

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

@Truntle在大多数情况下它是最好的
type ExtractKeysOfType<T, TValue> = { [P in keyof T]: T[P] extends TValue ? P : TValue}[keyof T]
function lengthLogger<T , K extends ExtractKeysOfType<T, any[]>>(object: T, key: K) {
    console.log((object as any)[key].length)
}

lengthLogger({
    foo: "",
    bar: ["", ""]
}, 'bar')

lengthLogger({
    foo: "",
    bar: ["", ""]
}, 'foo') // Error