如何将TypeScript联合类型中的number转换为string类型?
解决方案
问题出在原工具类型没有对联合类型的成员进行分布式处理。我们需要调整条件类型的写法,让它能逐个处理联合类型中的每个成员:
首先定义一个用于转换单个类型的工具:
type ElementNumberToString<T> = T extends number ? string : T;
然后修改原NumberToString类型,将每个属性的类型传入这个工具:
type NumberToString<T> = { [K in keyof T]: ElementNumberToString<T[K]>; };
原理说明
TypeScript的条件类型在处理联合类型时,会自动触发分布式条件类型机制——当条件类型的输入是联合类型时,它会将联合拆分为单个成员,分别应用条件判断后再将结果合并为新的联合类型。
原写法中T[K] extends number是直接判断整个联合类型(比如number | null)是否继承自number,显然不成立,所以返回原类型。而拆分后,ElementNumberToString会分别处理number和null,得到string和null,最终合并为string | null。
验证示例
- 输入
{ num: number },输出{ num: string },符合预期。 - 输入
{ maybeNum: number | null },输出{ maybeNum: string | null },解决了原问题。 - 输入
{ mixed: number | string | boolean },输出{ mixed: string | boolean },正确转换了联合中的number成员。
内容的提问来源于stack exchange,提问作者Nic
相关产品推荐
相关产品推荐

