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

