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

如何定义Utility Type将(A | B)[]转换为[A, B]元组类型?

将联合数组类型转为指定元组类型的解决方案

问题场景

你给出的代码中,数组array被TypeScript默认推断为(A | B)[],但实际需要的是[A, B]这样的精确元组类型:

interface A {
  type: string
}

interface B {
  type: number
}

const a = {} as A
const b = {} as B

// 当前类型:(A | B)[]
const array = [a, b]

解决方案

方式一:直接让数组推断为元组(最简便)

在定义数组时使用as const断言,强制TypeScript保留元素的类型和顺序,推断为只读元组:

const array = [a, b] as const;
// 此时 array 的类型为 readonly [A, B]

如果需要可变元组,可以通过工具类型转换只读元组:

type MutableTuple<T extends readonly any[]> = [...T];
type ArrayTuple = MutableTuple<typeof array>; // 类型为 [A, B]

方式二:显式注解元组类型

直接给数组变量指定元组类型,明确约束元素的顺序和类型:

const array: [A, B] = [a, b];
// 类型直接为 [A, B]

方式三:定义通用工具类型转换数组类型

如果需要将一个已知结构的数组类型转换为元组类型(仅适用于元素数量和顺序确定的数组类型),可以用infer关键字实现工具类型:

type ArrayToTuple<T extends any[]> = T extends [infer First, ...infer Rest] 
  ? [First, ...ArrayToTuple<Rest>] 
  : [];

// 使用示例:
type FixedArray = [A, B];
type TupleType = ArrayToTuple<FixedArray>; // 结果为 [A, B]

注意:如果是不确定长度的联合数组类型(如(A | B)[]),TypeScript无法从中推断出具体元组结构,因为该类型丢失了元素的顺序和数量信息,这种情况下上述工具类型会返回空元组[]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:31:17