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

TypeScript中如何将联合类型转换为数组的联合类型?

实现联合类型到成员数组联合类型的转换

要实现你想要的ToUnionOfArray类型,核心是利用TypeScript的分布式条件类型特性——当联合类型作为条件类型的输入时,TypeScript会自动将联合类型的每个成员单独代入条件进行计算,最后将结果重新组合成联合类型。

具体实现

type ToUnionOfArray<T> = T extends unknown ? T[] : never;

测试验证

用你的Foo类型测试:

type Foo = string | number;
type TransformedFoo = ToUnionOfArray<Foo>; 
// 结果:string[] | number[],完全符合预期

为什么这个方案有效?

当T是联合类型string | number时,TypeScript会把它拆分成两个独立的条件判断:

  1. string extends unknown ? string[] : never → 得到string[]
  2. number extends unknown ? number[] : never → 得到number[]
    最后将这两个结果合并,就得到了string[] | number[]。

和Foo[]的关键区别

  • Foo[]生成的是(string | number)[]:数组中可以同时包含字符串和数字(比如['a', 1]是合法的)
  • ToUnionOfArray<Foo>生成的是string[] | number[]:数组只能是纯字符串数组,或者纯数字数组(['a', 1]会被TS判定为不合法)

举个代码示例直观对比:

// 合法:(string | number)[]允许混合类型
const mixedArr: (string | number)[] = ["hello", 123];

// 不合法:string[] | number[]不允许混合类型
const invalidArr: string[] | number[] = ["hello", 123];

// 合法:纯字符串数组
const strArr: string[] | number[] = ["hello", "world"];

// 合法:纯数字数组
const numArr: string[] | number[] = [123, 456];

补充说明

这里的unknown可以替换成any或者其他任何所有类型都能extends的类型(比如T extends T ? T[] : never也能生效),核心是触发TypeScript的分布式条件类型逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:07:27