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

TypeScript中如何批量省略接口中继承自另一接口的所有属性

TypeScript中如何批量省略接口中继承自另一接口的所有属性

嗨,这个问题我之前也碰到过,手动列所有继承来的属性确实太繁琐了!其实TypeScript的类型系统里有个很省心的方法,不用重复写那些要省略的键就能搞定。

最简单的方式就是直接结合Omit和keyof这两个工具:

interface A {
  a: number;
  b: number;
  c: number;
  d: number;
}

interface B extends A {
  e: string;
  f: string;
}

// 一行代码得到B中不属于A的属性类型
type BWithoutA = Omit<B, keyof A>;

// 现在这个类型就完全符合你的需求了
const a: BWithoutA = {
  e: 'foo',
  f: 'bar',
};

我给你拆解一下这个逻辑:

  • keyof A会自动获取接口A的所有属性名,也就是'a' | 'b' | 'c' | 'd';
  • Omit<B, keyof A>的作用就是从B类型中移除所有属于A的属性,剩下的自然就是B自己定义的e和f了。

如果以后你的接口A或者B加了新属性,这个类型会自动更新,完全不用手动修改要省略的键列表,非常灵活。

要是你想把这个逻辑封装成一个通用的工具类型(方便在项目里多次复用),也可以这么写:

// 通用工具类型:移除T中继承自Base的所有属性
type OmitInherited<T, Base> = Omit<T, keyof Base>;

// 用法和之前完全一样
type BWithoutA = OmitInherited<B, A>;

测试一下就知道,现在BWithoutA严格只包含e和f,如果不小心给a变量加了A里的属性,TypeScript会立刻抛出错误,完美满足你的需求!

备注:内容来源于stack exchange,提问作者Lucas Sanchez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:54:31