如何实现移除对象中指定类型字段的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
相关产品推荐
相关产品推荐

