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

如何实现移除对象中指定类型字段的TypeScript泛型?

如何实现移除指定类型字段的TypeScript泛型?

现有接口定义如下:

interface X {
  a: number;
  b: number;
  с: string;
  d: number[];
}

需要实现泛型DeleteFields<T, D>,移除T中所有类型为D的字段。比如DeleteFields<X, number>应该得到{ с: string; d: number[]; }。

当前的实现仅将目标字段类型设为空字符串,并未真正移除字段:

type DeleteFields<T, D> = {
  [P in keyof T]: T[P] extends D ? "" : T[P];
}

type XNumbersNoNum = DeleteFields<X, number>; // { a: ""; b: ""; с: string; d: number[]; }

正确实现方式

要真正移除字段,需要先筛选出类型不匹配D的键,再基于这些键构建新类型。可以通过TypeScript的键重映射语法直接实现:

type DeleteFields<T, D> = {
  [P in keyof T as T[P] extends D ? never : P]: T[P];
};

type XNumbersNoNum = DeleteFields<X, number>; // { с: string; d: number[]; }

代码解释

  • as T[P] extends D ? never : P:这是键重映射的核心逻辑——当字段类型匹配D时,将键映射为never,该键会被自动排除;不匹配则保留原键。
  • 最终生成的类型只会保留类型不等于D的字段,完全符合需求。

也可以结合Omit和条件类型拆分实现,逻辑一致:

// 先提取所有需要移除的键
type KeysToRemove<T, D> = { [P in keyof T]: T[P] extends D ? P : never }[keyof T];

// 用Omit移除这些键
type DeleteFields<T, D> = Omit<T, KeysToRemove<T, D>>;

type XNumbersNoNum = DeleteFields<X, number>; // { с: string; d: number[]; }

内容的提问来源于stack exchange,提问作者Boris Borais

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:22:32