TypeScript中如何将键值对元组转换为值组成的元组
实现
ValuesFromPairs泛型工具类型 利用TypeScript对元组类型的同态映射特性即可实现——TS在遍历元组做映射时,会自动保留元组的长度和元素顺序,不会退化为普通数组联合类型,完整实现代码如下:
type ValuesFromPairs<T extends readonly { k: unknown }[]> = { [Index in keyof T]: T[Index] extends { k: infer Value } ? Value : never }
实现逻辑说明
- 首先给泛型参数
T加类型约束:必须是元素带k属性的只读数组/元组,同时兼容可变元组、只读元组两种传入场景。 - 遍历元组的所有索引位:TS会自动跳过
length、数组原型方法这类非元素索引的键,保证返回结果和输入元组长度一致、元素位置一一对应。 - 对每个索引位的元素,用条件类型的
infer关键字推断出k属性对应的值类型,作为新元组同位置的类型。
效果验证
用示例代码测试可以得到完全符合预期的结果:
type PairsTuple = [{ k: 1 }, { k: 2 }, { k: 3 }] type ValuesTuple = ValuesFromPairs<PairsTuple> // 类型计算结果为 [1, 2, 3]
该实现也兼容边界场景:传入空元组[]时返回类型为[],传入只读元组时也可以正常提取值。
内容的提问来源于stack exchange,提问作者Keys
相关产品推荐
相关产品推荐

