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

如何在TypeScript中省略对象的孙子属性?

如何在TypeScript中省略嵌套的孙子属性(保留父属性)

基础解决方案

核心思路是:先移除原类型中的interests属性,再交叉一个剔除了likes的新interests属性,以此构造出符合需求的新类型,同时不影响ILikes本身的必填性。

interface ILikes {
  article: string;
  page: string;
  userId: number | string;
}

interface ISaved {
  postId: string;
}

interface IUserData {
  userName: string;
  isAdmin: boolean;
  userId: number;
  interests: {
    likes: ILikes;
    saved: ISaved;
  };
}

// 构造移除likes后的用户类型
type UserDataWithoutLikes = Omit<IUserData, 'interests'> & {
  interests: Omit<IUserData['interests'], 'likes'>;
};

// 正确使用:无需提供likes属性
const userObj: UserDataWithoutLikes = {
  userName: "Arcanus",
  isAdmin: false,
  userId: 1001,
  interests: {
    saved: { postId: "post_001" }
  }
};

// 其他场景仍可正常使用完整的IUserData
const fullUser: IUserData = {
  userName: "Admin",
  isAdmin: true,
  userId: 1000,
  interests: {
    likes: { article: "TS Guide", page: "docs", userId: 1000 },
    saved: { postId: "post_002" }
  }
};

通用工具类型方案

如果需要频繁处理不同层级的嵌套属性省略,可以封装一个通用的NestedOmit工具类型,支持通过点路径指定要移除的目标属性:

// 通用嵌套属性省略工具类型
type NestedOmit<T, K extends string> = K extends `${infer Parent}.${infer Child}`
  ? Omit<T, Parent> & { [P in Parent]: NestedOmit<T[P], Child> }
  : Omit<T, K>;

// 使用方式更简洁
type UserDataWithoutLikes = NestedOmit<IUserData, 'interests.likes'>;

// 使用示例和基础方案一致
const userObj: UserDataWithoutLikes = {
  userName: "Arcanus",
  isAdmin: false,
  userId: 1001,
  interests: {
    saved: { postId: "post_001" }
  }
};

这个工具类型通过条件类型解析点分隔的属性路径,递归处理嵌套层级,适用于任意深度的属性省略需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:24:28