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
相关产品推荐
相关产品推荐

