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

如何使TypeScript将二维元组数组的索引0推断为字面量联合类型?

让TypeScript推断元组数组索引0为联合类型数组的方法

要让result的类型变成("a" | "c")[],核心是保留元组第一个元素的字面量类型信息——原来的KV类型是[string, string],会把具体的字面量(比如"a"、"c")拓宽为string,导致TypeScript无法推断出联合类型。

可以通过泛型捕获输入数组的具体类型来实现,具体写法如下:

// 用泛型T捕获每个元组的具体类型
function sample<T extends [string, string]>(param: readonly T[]) {
  // 提取每个元组的第一个元素类型,组成联合类型数组
  return param.map(([key]) => key) as (T[0])[];
}

// 调用函数时,TypeScript会自动推断T为["a","b"] | ["c","d"]
const result = sample([
  ["a", "b"],
  ["c", "d"],
]);
// result的类型为 ("a" | "c")[]

如果需要更灵活的类型约束(比如允许元组第二个元素是任意类型),可以调整泛型:

function sample<T extends [string, unknown]>(param: readonly T[]) {
  return param.map(([key]) => key) as (T[0])[];
}

另外,如果输入的数组是预先定义的变量,可以用as const断言强制保留字面量类型,再传入函数:

const kvs = [
  ["a", "b"],
  ["c", "d"],
] as const;

function sample<T extends readonly [string, string][]>(param: T) {
  return param.map(([key]) => key) as (T[number][0])[];
}

const result = sample(kvs);
// result类型为 ("a" | "c")[]

原理是:泛型T会捕获输入数组中每个元组的具体字面量类型,T[0](或T[number][0])会提取所有元组第一个元素的类型组成联合类型,最终返回值的类型就是这个联合类型的数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:45:29