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

如何在TypeScript中编写通用的omit函数?

TypeScript 通用 omit 函数实现优化

你的代码思路方向没问题,但循环过滤的逻辑存在缺陷:当okeys包含多个元素时,只要有一个过滤键和当前对象键不相等,就会执行赋值操作——这会导致同一个键被重复赋值,而且如果当前键本身就在待剔除列表里,只要有其他过滤键和它不等,还是会错误保留该键。

下面是修正后的实现,同时提供几种更简洁的写法:

修正原逻辑的版本

function omit<T, P extends keyof T>(obj: T, okeys: P[]): Omit<T, P> {
  return (Object.keys(obj) as Array<keyof T>).reduce((newObj, key) => {
    // 直接判断当前键是否不在待剔除列表中,逻辑更清晰
    if (!okeys.includes(key as P)) {
      newObj[key] = obj[key];
    }
    return newObj;
  }, {} as Omit<T, P>);
}

基于对象解构的简洁版本

利用对象解构忽略指定键的特性,实现更直观:

function omit<T, P extends keyof T>(obj: T, okeys: P[]): Omit<T, P> {
  // 构造一个包含待剔除键的占位对象
  const omitMap = okeys.reduce((acc, key) => {
    acc[key] = undefined;
    return acc;
  }, {} as Record<P, undefined>);
  
  // 合并后解构,自动忽略待剔除键
  const { ...rest } = { ...obj, ...omitMap };
  return rest;
}

先筛选保留键的版本

先找出所有需要保留的键,再构建新对象,可读性更强:

function omit<T, P extends keyof T>(obj: T, okeys: P[]): Omit<T, P> {
  const keepKeys = (Object.keys(obj) as Array<keyof T>).filter(
    key => !okeys.includes(key as P)
  );
  
  return keepKeys.reduce((acc, key) => {
    acc[key] = obj[key];
    return acc;
  }, {} as Omit<T, P>);
}

类型说明

  • 泛型T约束输入对象的类型,P约束为T的键集合,确保传入的okeys都是对象实际存在的属性,避免类型错误。
  • 返回值使用Omit<T, P>类型,准确描述剔除指定属性后的对象结构,保证类型安全。

内容的提问来源于stack exchange,提问作者Makaraju Bhanu prathyusha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:50:31