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

