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

如何在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公共属性,仅需要做两处修改即可:

  1. 在User接口中新增age?: string属性定义
  2. 把'age'添加到PUBLIC_USER_KEYS数组中
    无需修改任何赋值、提取逻辑,类型会自动同步,公共属性也会自动提取。

可选轻量方案(属性少的场景)

如果你的PublicUser属性数量很少,也可以用对象解构实现,无需额外工具函数:

const { userId, name } = user;
const visibleUser: PublicUser = { userId, name };

缺点是新增属性时需要同步修改解构语句和返回对象,维护成本比上述通用方案高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:48:01