我有一个带有 getter 的类,它被设置为返回一个提供给构造函数的值
class Example {
private _field;
constructor(field) {
this._field = field;
}
get field() {
return this._field;
}
}
问题是,当我执行 JSON.stringify(new Example('whatever'))
时,_field
也被序列化。我当前的解决方法是使用闭包在构造函数中定义属性
class Example {
constructor(field) {
Object.defineProperty(this, 'field', {
get: () => field;
}
}
}
这样我就不需要字段,但现在 TS 编译器提示没有 field
属性。有没有更好的办法?
或者也许我应该找到一种方法来将 _field
排除在序列化之外?
最佳答案
@SlavaShp 写的是(在我看来)要走的路,但您可以将其放入一个类中,然后您可以扩展该类,以便为您需要的每个新类获得此行为。
类似于:
abstract class JsonEncoded {
private exposedFields: string[];
constructor(fields: string[]) {
this.exposedFields = fields;
}
public toJSON(): string {
let json = "";
this.exposedFields.forEach(fieldName => json += fieldName + ":" + JSON.strinify(this[fieldName]));
return "{" + json + "}";
}
}
然后您只需扩展并通知构造函数它应该包含哪些字段:
class Example extends JsonEncoded {
private _field;
constructor(field) {
super(["field"]);
this._field = field;
}
get field() {
return this._field;
}
}
关于json - TypeScript 在不公开字段的情况下定义 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36689068/