javascript - 如何创建基于以“_”开头的属性名称将所有类属性设置为不可枚举的 Typescript 装饰器?
问题描述
如何让 Typescript 类装饰器调用一个方法,该方法将任何以“_”开头的属性或方法设置为不可枚举属性(本质上将其设为私有以用于序列化目的)?
想象一下,有一个类是一个基类,我的应用程序中的所有其他类都将从该类扩展:
class Base {
constructor(data: any){
Object.assign(this, data)
}
_setNonEnumerableProperties(){
Object.keys(this).forEach(key => {
if(key[0] === '_')
Object.defineProperty(this, key, { enumerable: false })
})
}
}
然后我有一个像这样的用户类:
@nonEnumerablePrivateMembers
class User extends Base {
public name: string
public email: string
private _active: boolean
}
我创建并 JSON 字符串化一个 User 实例,如下所示:
const user = new User({name: 'John', email: 'john@example.com', _active: false})
const jsonUser = JSON.stringify(user)
console.log(jsonUser)
我希望输出是这样的:
{ "name": "John", "email": "john@example.com" }
而不是这个:
{ "name": "John", "email": "john@example.com", "_active": false }
请注意,它不包括该_active
属性。
我需要知道如何编写nonEnumerablePrivateMembers
装饰器,它会_setNonEnumerableProperties
在扩展类的新实例上调用基类上的方法。
有什么建议么?
解决方案
覆盖构造函数似乎按预期工作:
interface Class<T> {
new(...args: any[]): T
}
function nonEnumerablePrivateMembers<T extends Class<Base>>(cls: T): T {
return class extends cls {
constructor(...args: any[]) {
super(...args);
this._setNonEnumerableProperties();
}
}
}
推荐阅读
- java - 我可以告诉杰克逊根据不同类型的方法有条件地序列化私有实例变量吗?
- python - 如何在没有子导入的情况下导入模块
- python - pyqt5 "AttributeError: type object 'Window' has no attribute label" 但它有吗?
- microsoft-graph-api - 从客户端调用时,Microsoft 图形转换内容端点失败
- python-3.x - 在 url 前添加额外的字符串
- excel - 运行时错误 438:此对象不支持此属性或方法”
- angular - Angular 控制器未在浏览器中加载
- intellij-idea - IntelliJ 没有使用正确的插件注册文件类型
- javascript - 在 laravel 项目上测试 API 时如何绕过身份验证级别?
- php - htmlspecialchars() 期望参数 1 是字符串,给定数组 - Laravel