如何在TypeScript中仅为联合类型映射对象属性类型
TypeScript 联合类型判断与映射类型实现
实现IsUnion<T>类型
要判断一个类型是否为联合类型,可以利用TypeScript联合类型的分布式条件类型特性,通过对比拆分前后的类型结果来实现:
type IsUnion<T, U = T> = T extends U ? [U] extends [T] ? false : true : false;
原理说明
- 当
T是联合类型时,T extends U会触发分布式特性,把T拆分为每个子类型单独判断。此时U是原始的联合类型,[U] extends [T]会因为T是单个子类型而返回false,最终整个表达式返回true。 - 当
T不是联合类型时,T和U完全相等,[U] extends [T]返回true,最终表达式返回false。
完善MappedType<T>类型
结合IsUnion修正原代码的分支逻辑(需求中要求非联合类型对应{ enum: never }而非never),最终实现如下:
type IsUnion<T, U = T> = T extends U ? [U] extends [T] ? false : true : false; type MappedType<T> = { [K in keyof T]: IsUnion<T[K]> extends true ? { enum: T[K][] } // 等价于 Array<T[K]> : { enum: never }; };
测试示例
用你提供的OriginalType验证效果:
type OriginalType = { foo: "a" | "b"; bar: "c"; foobar: Record<string, string>; }; type ResultType = MappedType<OriginalType>; // ResultType 最终为: // { // foo: { enum: ("a" | "b")[] }, // bar: { enum: never }, // foobar: { enum: never } // }
内容的提问来源于stack exchange,提问作者Harrison Waala
相关产品推荐
相关产品推荐

