TypeScript:如何按值移除对象/映射类型的属性
根据属性值移除对象属性的TypeScript工具类型
当然可以实现类似Omit但基于属性值筛选的工具类型,核心是用映射类型结合键重映射(as子句)和条件类型来完成。
通用实现:OmitByValue
先定义一个通用的工具类型,支持指定要移除的属性值类型:
type OmitByValue<T, ValueType> = { [K in keyof T as T[K] extends ValueType ? never : K]: T[K] };
代码解释
- 遍历原类型
T的所有键K - 通过
as子句对键进行重映射:如果属性值T[K]是目标值类型ValueType的子类型,就将该键映射为never(TypeScript会自动排除键为never的属性);否则保留原键K - 保留符合条件的属性值
T[K]
针对never的专用工具类型
如果只需要移除值为never的属性,可以封装更简洁的版本:
type OmitNever<T> = OmitByValue<T, never>;
使用示例
针对你给出的类型Q:
type Q = {a: number, b: never}; // 移除值为never的属性 type FilteredQ = OmitNever<Q>; // 最终结果:{a: number}
再看一个包含可选属性和联合类型的复杂例子:
type ComplexType = { id: string, temp: never, count?: number, status: 'active' | never // 等价于 'active' }; type FilteredComplex = OmitNever<ComplexType>; // 结果:{id: string, count?: number, status: 'active'}
内容的提问来源于stack exchange,提问作者MaximilianMairinger
相关产品推荐
相关产品推荐

