如何实现TypeScript类型中null与undefined的相互替换?
TypeScript 类型转换:替换 null/undefined 类型
针对你提出的两种类型转换需求,可以通过 TypeScript 的映射类型和条件类型实现精准替换,不会额外新增 null 或 undefined 类型。
场景一:将类型中的 undefined 替换为 null
需求:把类型中属性的 undefined 类型替换成 null,其他类型保持不变。
实现工具类型 ReplaceUndefinedWithNull:
type ReplaceUndefinedWithNull<T> = { [K in keyof T]: T[K] extends undefined ? null : T[K] extends infer U | undefined ? U | null : T[K]; };
使用示例:
// 原类型 type A = { a: number | undefined; b: string; }; // 转换后的类型 type B = ReplaceUndefinedWithNull<A>; // 等价于: // type B = { // a: number | null; // b: string; // };
场景二:将类型中的 null 替换为 undefined
需求:把类型中属性的 null 类型替换成 undefined,其他类型保持不变。
实现工具类型 ReplaceNullWithUndefined:
type ReplaceNullWithUndefined<T> = { [K in keyof T]: T[K] extends null ? undefined : T[K] extends infer U | null ? U | undefined : T[K]; };
使用示例:
// 原类型 type A = { a: number | null; b: string; }; // 转换后的类型 type B = ReplaceNullWithUndefined<A>; // 等价于: // type B = { // a: number | undefined; // b: string; // };
逻辑说明
- 映射类型
[K in keyof T]遍历原类型的所有属性; - 第一层条件判断处理属性类型就是
undefined(或null)的情况; - 第二层条件判断处理属性类型是「基础类型 | undefined」(或「基础类型 | null」)的复合情况,通过
infer U提取基础类型,再拼接目标类型; - 最后保留原类型中不包含目标替换类型的属性。
内容的提问来源于stack exchange,提问作者Renan Cidale
相关产品推荐
相关产品推荐

