【问题标题】:TypeScript define getter without exposing fieldTypeScript 定义 getter 而不暴露字段
【发布时间】:2016-08-09 21:37:35
【问题描述】:

我有一个带有 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 排除在序列化之外?

【问题讨论】:

  • 你能用一个函数吗? "getField() { return this._field; }"

标签: json properties typescript ecmascript-6


【解决方案1】:

您可以从序列化部分解决问题:

    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;
        }
    });

考虑到如果您要序列化复杂对象,您很可能必须实现某种自定义序列化以(例如)根据业务逻辑标准跳过某些字段,这可能不是一个坏主意.

【讨论】:

    【解决方案2】:

    您可以在对象上创建toJson 方法来提供要序列化的属性。 Stringify 将使用它。 你可以看这里stringify documentation

    【讨论】:

      【解决方案3】:

      @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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-05-18
        • 1970-01-01
        • 1970-01-01
        • 2018-06-19
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多