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会把它拆分成两个独立的条件判断:
string extends unknown ? string[] : never→ 得到string[]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
相关产品推荐
相关产品推荐

