如何实现移除类型中值为undefined成员的RemoveUndefinedValues泛型?
实现
RemoveUndefinedValues泛型过滤值为undefined的属性 当然可以解决这个问题!我们可以利用TypeScript的映射类型和条件类型组合,实现一个自动移除值类型为undefined的属性的泛型。
泛型实现代码
type RemoveUndefinedValues<T> = { [K in keyof T as T[K] extends undefined ? never : K]: T[K] };
代码拆解说明
我们一步步看这个泛型的工作逻辑:
- 遍历属性键:
[K in keyof T]会逐个遍历原类型T的所有属性键K; - 过滤目标键:通过
as T[K] extends undefined ? never : K的键重映射语法——如果当前属性的值类型T[K]严格等于undefined,就把这个键名替换成never(TypeScript会自动忽略never类型的键),否则保留原键名; - 保留有效类型:冒号后的
T[K]会完整保留非undefined属性的原类型。
验证你的示例
用你给出的类型T测试效果:
type T = { a: number; b: undefined; }; type T2 = RemoveUndefinedValues<T>; // 此时T2的类型为 { a: number }
现在你就能正常完成赋值操作了:
const c: T2 = { a: 0 }; // 完全符合类型要求,不会触发任何错误
扩展场景适配
如果需要移除**所有可能为undefined**的属性(比如值类型是string | undefined这种联合类型),可以修改泛型的判断逻辑:
type RemoveUndefinedValues<T> = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] };
比如{a: number | undefined, b: string}经过处理后,会变成{b: string}。
内容的提问来源于stack exchange,提问作者Sinder
相关产品推荐
相关产品推荐

