如何在TypeScript或JavaScript中仅获取基接口的全部属性?
实现方案
TypeScript 的接口类型仅在编译阶段生效,运行时无对应类型信息,无法直接从接口定义自动提取属性,你可以通过统一维护公共属性键集合的方式实现需求,后续新增公共属性仅需修改一处配置,无需调整赋值逻辑。
步骤1:统一维护公共属性键,联动类型定义
// 显式定义PublicUser的所有属性键,运行时可访问 const PUBLIC_USER_KEYS = ['userId', 'name'] as const; type PublicUserKey = typeof PUBLIC_USER_KEYS[number]; // User 接口定义不变 interface User { userId?: string name?: string email?: string phonenumber?: string } // 从公共键集合自动推导PublicUser类型,无需重复写属性定义 interface PublicUser extends Pick<User, PublicUserKey> {}
步骤2:实现通用属性提取函数
实现一个通用的pick工具函数,用于从完整对象中提取指定键的属性:
function pick<T, K extends keyof T>(originObj: T, pickKeys: K[]): Pick<T, K> { const targetObj = {} as Pick<T, K>; for (const key of pickKeys) { // 仅保留原值不为undefined的属性,和你原有逻辑一致 if (originObj[key] !== undefined) { targetObj[key] = originObj[key]; } } return targetObj; }
步骤3:业务代码调用
const user = serverData as User; // 直接提取PublicUser的所有属性,无需逐个赋值 const visibleUser: PublicUser = pick(user, PUBLIC_USER_KEYS); sendPublicProfileToAnyone(visibleUser);
后续拓展方式
如果后续需要给PublicUser新增age公共属性,仅需要做两处修改即可:
- 在
User接口中新增age?: string属性定义 - 把
'age'添加到PUBLIC_USER_KEYS数组中
无需修改任何赋值、提取逻辑,类型会自动同步,公共属性也会自动提取。
可选轻量方案(属性少的场景)
如果你的PublicUser属性数量很少,也可以用对象解构实现,无需额外工具函数:
const { userId, name } = user; const visibleUser: PublicUser = { userId, name };
缺点是新增属性时需要同步修改解构语句和返回对象,维护成本比上述通用方案高。
内容的提问来源于stack exchange,提问作者Robert Kwon
相关产品推荐
相关产品推荐

