如何实现从键数组返回元组类型的TypeScript函数?
解决TypeScript中根据键数组返回对应值元组的类型推断问题
你遇到的核心问题是Array.map()默认会返回元素类型为联合类型的数组,而非对应键顺序的元组类型。虽然用了const参数让键数组被推断为字面量元组,但TypeScript无法自动将map的结果关联到元组每个位置对应的属性类型。
修改后的实现代码
type User = { name: string, location: string age: number } const fooUser: User = { age: 30, name: "Foo", location: "Bar", } const getSelected = <T extends User, const K extends readonly (keyof T)[]>( user: T, keys: K ): { [I in keyof K]: T[K[I]] } => { // 用类型断言告诉TS,map的结果是对应顺序的元组 return keys.map((key) => user[key]) as { [I in keyof K]: T[K[I]] }; } const [age, userName] = getSelected(fooUser, ['age', 'name']) // 现在age的类型是number,userName是string,符合预期
关键说明
- 精确的返回类型定义:通过
{ [I in keyof K]: T[K[I]] }这个映射类型,遍历键数组K的每个索引I,将其对应到对象T中K[I]键的属性类型,生成和键数组顺序完全匹配的元组类型。 - 类型断言的必要性:由于TypeScript的
map方法本身只能推断出数组类型(无法自动识别元组结构),所以需要用as断言将结果转换为我们定义的元组类型。 - const参数的作用:
const K确保键数组被推断为字面量元组(比如['age', 'name']而非宽泛的(keyof User)[]),这是后续映射类型能精确工作的基础。
内容的提问来源于stack exchange,提问作者Martin Hansson
相关产品推荐
相关产品推荐

