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

