json - TypeScript 在不公开字段的情况下定义 getter

标签 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;
     }
  }
}

这样我就不需要字段,但现在 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/

相关文章:

javascript - 使用 URL 中的 JSON 数据来显示 Google map 标记 - 怎么做?

python - 属性与 Getter 和 Setter

swift - 属性 getter 和 setter

javascript - AngularJS 不处理 JSON 引用

javascript - 在 Javascript 中访问 Json

typescript - 如何在 .map 中定义解构参数的类型

javascript - Fullcalendar + Angular 6 和 jQuery : TS2304: Cannot find name 'JQueryPromise'

javascript - Bing map 的 Chutzpah CDN 问题

python - 解析 boto3 输出 JSON

javascript - 如何在 for...in 中获取嵌套对象属性的正确属性?