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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:28:13