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

TypeScript 5中如何实现多层级嵌套属性的Omit操作?

在TypeScript 5中实现嵌套属性的Omit操作

可以通过递归模板字面量类型和分布式条件类型实现嵌套属性的省略,完全适配TypeScript 5版本。以下是完整的解决方案:

// 辅助类型:将带"."的路径字符串拆分为属性名元组
type SplitPath<S extends string> = S extends `${infer Head}.${infer Tail}` 
  ? [Head, ...SplitPath<Tail>] 
  : [S];

// 核心嵌套Omit类型
type NestedOmit<T, Paths extends string> = 
  Paths extends infer P extends string 
    ? P extends `${infer Parent}.${infer Rest}`
      ? // 处理嵌套属性:保留顶层其他属性,对目标子属性递归应用Omit
        Omit<T, Parent> & {
          [K in Parent]: K extends keyof T 
            ? NestedOmit<T[K], Rest> 
            : never;
        }
      : // 处理顶层属性:直接使用原生Omit
        Omit<T, P>
    : T;

// 你的原始接口定义
interface IFirstObject {
  id: string;
  revisionId: string;
  someProperty: ISecondObject;
}

interface ISecondObject {
  somePropertyToKeep: string;
  firstPropertyToOmit: string;
  secondPropertyToOmit: string;
}

// 使用示例
type TargetType = NestedOmit<IFirstObject, "id" | "someProperty.firstPropertyToOmit" | "someProperty.secondPropertyToOmit">;

const myObject: TargetType = {
  revisionId: "some revision id",
  someProperty: {
    somePropertyToKeep: "some property to keep"
  }
};

核心类型说明

  • SplitPath:通过模板字面量的递归匹配,将嵌套路径(如"someProperty.firstPropertyToOmit")拆分为属性名元组(如["someProperty", "firstPropertyToOmit"]),为逐层处理嵌套结构提供基础。
  • NestedOmit:
    • 针对带.的嵌套路径:先保留当前对象除父属性外的所有字段,再对父属性对应的子对象递归执行嵌套省略;
    • 针对顶层路径:直接调用原生Omit工具类型移除目标属性;
    • 利用TypeScript的分布式条件类型,自动遍历联合类型中的每一条路径,最终合并所有省略操作的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:12:25