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

TypeScript中如何从const数组提取值并保留元组类型?

实现从const断言数组映射出元组类型

TypeScript 中默认的 Array.prototype.map 方法不会保留原数组的元组结构——哪怕你用 as const 断言了原数组为只读元组,map 返回的结果依然会被推断为联合类型的数组(('A' | 'B' | 'C')[])。要实现预期的元组类型,有两种可行方案:

方案一:自定义保留元组结构的map函数

通过泛型约束和类型映射,写一个专门处理元组的map工具函数,让返回值自动继承原元组的结构:

const mapTuple = <T extends readonly any[]>(
  tuple: T,
  fn: (item: T[number], index: number) => any
): { [K in keyof T]: ReturnType<typeof fn> } => {
  return tuple.map(fn) as any;
};

const myArray = [
  { label: 'A title', value: 'A'},
  { label: 'B title', value: 'B'},
  { label: 'C title', value: 'C'},
] as const;

// myValues 类型为 readonly ["A", "B", "C"]
const myValues = mapTuple(myArray, v => v.value);

// 若需要可变元组,可添加类型转换
const mutableValues = mapTuple(myArray, v => v.value) as ["A", "B", "C"];

方案二:类型断言结合元组映射

如果你不想额外定义工具函数,可以直接通过类型映射提取元组的value类型,再对map结果做类型断言:

const myArray = [
  { label: 'A title', value: 'A'},
  { label: 'B title', value: 'B'},
  { label: 'C title', value: 'C'},
] as const;

// 定义元组值提取类型
type ExtractTupleValues<T extends readonly { value: any }[]> = { 
  [K in keyof T]: T[K]['value'] 
};

// myValues 类型为 ["A", "B", "C"]
const myValues = myArray.map(v => v.value) as ExtractTupleValues<typeof myArray>;

注意:方案二的类型断言需要确保map的逻辑确实是提取每个元素的value字段,如果后续修改map逻辑,需要同步调整类型,否则会出现类型不匹配的问题。

内容的提问来源于stack exchange,提问作者Rychard Vale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:57:14