You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:02