TypeScript定义getter而不暴露字段

时间:2016-04-18 08:36:21

标签: json properties typescript ecmascript-6

我有一个带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+)?(;|$)被序列化?

3 个答案:

答案 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;
    }
}