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

Typescript如何从嵌套类数组中深层排除指定属性类型

TypeScript 深层移除嵌套属性实现方案

首先明确:你用到的Exclude是 TypeScript 原生用来过滤联合类型成员的工具类,并不适用于移除对象属性,移除对象属性应该用Omit,但原生Omit仅支持处理第一层属性,要实现深层嵌套(包括数组元素)的属性移除,需要自定义工具类型。


1. 自定义深层路径Omit工具类型

// 辅助工具:拆分属性路径字符串为元组
type SplitPath<S extends string> = S extends `${infer K}.${infer Rest}` ? [K, ...SplitPath<Rest>] : [S]

// 辅助工具:处理数组/普通对象的属性移除
type DeepOmitHelper<T, Path extends any[]> = 
  // 路径处理完直接返回原类型
  Path extends [] ? T :
  // 处理数组类型:对每个元素递归执行属性移除
  T extends Array<infer Item> ? Array<DeepOmitHelper<Item, Path>> :
  // 处理普通对象类型
  T extends object ? 
    Path extends [infer FirstKey extends keyof T, ...infer RestPath] ?
      Omit<T, FirstKey> & { [K in FirstKey]: DeepOmitHelper<T[K], RestPath> }
    : T
  : T

// 对外暴露的深层Omit:支持传入多个路径用|分隔
type DeepOmit<T, Paths extends string> = 
  (Paths extends any ? DeepOmitHelper<T, SplitPath<Paths>> : never) extends infer O ? { [K in keyof O]: O[K] } : never

2. 实际使用

注意你示例中的implement为拼写错误,TS中类实现类型的关键字是implements,修正后代码如下:

class Nested {
  propX!: string;
  propY!: string;
  propZ!: string;
}

class Parent {
  propA!: string;
  propB!: number;
  propC!: string;
  nesteds!: Nested[]; 
}

// 按需求移除顶层propC,以及nesteds数组每一项的propZ
class ParentInput implements DeepOmit<Parent, 'propC' | 'nesteds.propZ'> {
  propA!: string;
  propB!: number;
  // 此处如果定义propC会直接报TS错误
  nesteds!: Array<{
    propX: string;
    propY: string;
    // 此处如果定义propZ会直接报TS错误
  }>
}

效果验证

  • 给ParentInput实例的nesteds数组元素赋值propZ时,TS会提示该属性不存在
  • 给ParentInput实例赋值propC时,TS会提示该属性不存在

内容的提问来源于stack exchange,提问作者Abderrazzak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:24:07