我有一个带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;
}
}
}
也会被序列化。我目前的解决方法是使用闭包
field
这样我不需要该字段,但现在TS编译器抱怨没有_field
属性。还有更好的方法吗?
或许我应该找到一种方法来排除\d+([,.]\d+)?(;|$)
被序列化?
答案 0 :(得分:0)
您可以从序列化部分处理问题:
let result = JSON.stringify(obj, (key, value) =>
{
if(key.lastIndexOf("_", 0) === 0)
{
//Skip private fields assuming they all start with _
return undefined;
}
else
{
return value;
}
});
考虑到如果你要序列化复杂对象,你可能不得不实现某种自定义序列化(例如)根据业务逻辑标准跳过一些字段,这可能不是一个坏主意。
答案 1 :(得分:0)
您可以在对象上创建toJson
方法,以提供要序列化的属性。 Stringify将使用它。
你可以看看stringify documentation
答案 2 :(得分:0)
@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 + "}";
}
}
然后你只需要扩展并告知ctor它应该包含哪些字段:
class Example extends JsonEncoded {
private _field;
constructor(field) {
super(["field"]);
this._field = field;
}
get field() {
return this._field;
}
}