You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现从键数组返回元组类型的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,符合预期

关键说明

  1. 精确的返回类型定义:通过{ [I in keyof K]: T[K[I]] }这个映射类型,遍历键数组K的每个索引I,将其对应到对象T中K[I]键的属性类型,生成和键数组顺序完全匹配的元组类型。
  2. 类型断言的必要性:由于TypeScript的map方法本身只能推断出数组类型(无法自动识别元组结构),所以需要用as断言将结果转换为我们定义的元组类型。
  3. const参数的作用:const K确保键数组被推断为字面量元组(比如['age', 'name']而非宽泛的(keyof User)[]),这是后续映射类型能精确工作的基础。

内容的提问来源于stack exchange,提问作者Martin Hansson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:30:10