如何定义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
相关产品推荐
相关产品推荐

