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

TypeScript映射类型:如何自动移除类型未指定属性

解决方案

你的问题核心在于:TypeScript的类型断言(as SimpleUserObject)仅在编译时生效,运行时不会自动剔除多余属性;而...this会展开实例的所有属性,导致返回结果包含冗余字段。以下是几种简洁的实现方式:

1. 手动解构提取(最直观简洁)

直接解构需要的属性,再加上转换后的roleIds,完全匹配目标类型结构:

toServiceResponse(): SimpleUserObject {
  const { accessToken, refreshToken, expiresIn, refreshTokenExpiresIn, complexRoles } = this;
  return { accessToken, refreshToken, expiresIn, refreshTokenExpiresIn, roleIds: complexRoles.map(role => role.id) };
}

2. 通用属性过滤(适合属性较多的场景)

如果目标类型属性较多,可以先定义要保留的属性列表,再通过工具方法构建对象:

方式A:reduce 构建

toServiceResponse(): SimpleUserObject {
  const keepProps = ['accessToken', 'refreshToken', 'expiresIn', 'refreshTokenExpiresIn'] as const;
  return keepProps.reduce((res, prop) => ({ ...res, [prop]: this[prop] }), {} as Pick<ComplexUserObject, typeof keepProps[number]>) 
  & { roleIds: this.complexRoles.map(r => r.id) };
}

方式B:Object.fromEntries 单行写法

toServiceResponse(): SimpleUserObject {
  return {
    ...Object.fromEntries(Object.entries(this).filter(([k]) => ['accessToken', 'refreshToken', 'expiresIn', 'refreshTokenExpiresIn'].includes(k))),
    roleIds: this.complexRoles.map(role => role.id)
  } as SimpleUserObject;
}

关键说明

  • TypeScript 是编译时类型系统,无法仅通过类型断言在运行时过滤属性,必须手动指定要保留的字段。
  • 以上写法均能确保运行时返回的对象仅包含SimpleUserObject定义的属性,同时满足类型检查要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:35:48