将数组转换为映射类型元组的Typescript函数签名

将数组转换为映射类型元组的Typescript函数签名,typescript,variadic-tuple-types,Typescript,Variadic Tuple Types,在typescript中,数组可以通过 type Arr = any[]; const f = < T extends Arr > (...args: [...T]): [...T] => { return args; } const a = f(1, 'a'); // a is type of [number, string]. 但是得到了同样的c 我发现了一个使用对象而不是元组的解决方案,但是元组解决方案是受欢迎的 const f1 = <T extends

在typescript中,数组可以通过

type Arr = any[];
const f = < T extends Arr > (...args: [...T]): [...T] => {
  return args;
}

const a = f(1, 'a'); // a is type of [number, string].
但是得到了同样的c

我发现了一个使用对象而不是元组的解决方案,但是元组解决方案是受欢迎的

const f1 = <T extends keyof TypeMap>(...args: [...T[]]): {[P in T]: TypeMap[P]} => {
    throw null;
}
const {s, n} = f1('s', 'n');
const f1=(…args:[…T[]):{[P in T]:TypeMap[P]}=>{
抛出空值;
}
常数{s,n}=f1('s','n');

您想使用。给定
T
,一种元组类型,
{[I in keyof T]:…T[I]…}
将是另一种元组类型;
I
仅迭代
T
的数值索引。请注意,由于TypeScript(请参阅)中的错误/限制,编译器没有意识到
t[I]
将是
t
的元素类型,因此您必须使用类似的技巧

在您的例子中,从输入元组
T
扩展
数组
,您希望输出元组在数值索引
I
处具有类型为
TypeMap[T[I]]
的元素:

const h = <T extends (keyof TypeMap)[]>(...args: [...T]): {
    [I in keyof T]: TypeMap[Extract<T[I], keyof TypeMap>]
} => {
    throw null;
}

const c = h('s', 'n'); // [string, number] 
常量h=(…参数:[…T]):{ [I in keyof T]:类型映射[Extract] } => { 抛出空值; } 常数c=h('s','n');//[字符串,数字]

太棒了,有技巧和有用的链接。@qxg请不要忘记接受答案
const h = <T extends (keyof TypeMap)[]>(...args: [...T]): [...TypeMap[T[number]][]] => {
    throw null;
}
const f1 = <T extends keyof TypeMap>(...args: [...T[]]): {[P in T]: TypeMap[P]} => {
    throw null;
}
const {s, n} = f1('s', 'n');
const h = <T extends (keyof TypeMap)[]>(...args: [...T]): {
    [I in keyof T]: TypeMap[Extract<T[I], keyof TypeMap>]
} => {
    throw null;
}

const c = h('s', 'n'); // [string, number]