如何实现TypeScript函数:从对象中排除指定字段生成新对象
实现TypeScript对象字段排除函数
给定类型定义:
type Source = { a: number, b: number, c: number, d: number }
需要实现一个函数getAllFieldsBesides,从源对象中排除指定字段并返回新对象,先修正你原有的函数签名问题,再给出具体实现:
类型签名修正
你原函数的返回类型使用Exclude<T, K>是错误的,Exclude用于联合类型的成员排除,而针对对象类型移除属性应该用Omit<T, K>工具类型。另外,fieldsToOmit的类型可以优化为更易用的键名数组,或保留你原有的对象形式,以下提供两种实现:
实现1:基于排除字段数组(推荐,更直观高效)
function getAllFieldsBesides<T, K extends keyof T>( sourceObject: T, fieldsToOmit: K[] ): Omit<T, K> { const omitKeys = new Set(fieldsToOmit); const result = {} as Omit<T, K>; for (const key in sourceObject) { if (!omitKeys.has(key as K)) { result[key as keyof Omit<T, K>] = sourceObject[key]; } } return result; }
调用示例:
const obj1: Source = {a: 1, b: 2, c: 3, d: 4}; const obj2 = getAllFieldsBesides(obj1, ['a', 'c']); // obj2类型自动推导为Omit<Source, 'a' | 'c'>,即 { b: number, d: number }
实现2:基于排除字段对象(匹配你原示例的调用方式)
function getAllFieldsBesides<T, K extends keyof T>( sourceObject: T, fieldsToOmit: Record<K, unknown> ): Omit<T, K> { const result = {} as Omit<T, K>; for (const key in sourceObject) { if (!(key in fieldsToOmit)) { result[key as keyof Omit<T, K>] = sourceObject[key]; } } return result; }
调用示例(注意这里的{a, c}需要确保变量a、c已定义,或直接传入{a: undefined, c: undefined}):
const obj1: Source = {a: 1, b: 2, c: 3, d: 4}; // 直接传入包含要排除键的对象 const obj2 = getAllFieldsBesides(obj1, {a: undefined, c: undefined});
关键说明
- 使用
Set存储排除键,判断操作的时间复杂度为O(1),比数组includes的O(n)更高效,适合排除字段较多的场景。 - 泛型约束
K extends keyof T确保传入的排除字段都是源对象的合法键,避免类型错误。 - 返回类型
Omit<T, K>自动推导排除后的对象类型,无需手动指定Partial<Source>。
内容的提问来源于stack exchange,提问作者Rando Coder
相关产品推荐
相关产品推荐

