【问题标题】:Angular 2 (or 4) object serializationAngular 2(或 4)对象序列化
【发布时间】:2017-11-08 12:03:32
【问题描述】:

最近遇到以下难题:

标准

Typescript documentation 建议使用具有下划线前缀的私有成员创建对象定义,允许 getter/setter 使用所述成员的原始“名称”,提供间接公共访问(他们应该这样做)。

Angular documentation 另有建议,但未提供在其对象定义示例中为私有变量使用 getter 和 setter 的示例。

问题

我一直在最大程度上遵循 Typescript 编码标准。以下面的类为例:

public class Foo{
    private _bar:string;

    constructor(){ this._bar='Baz'; }

    get bar():string{return this._bar}
}

使用以下代码将其序列化为 JSON:

console.log(JSON.stringify(new Foo()));

...将产生:

{
    '_bar': 'Baz'
}

问题

  1. 考虑到这些是“指南”和简单的建议,Angular 处理对象定义的方式是什么,允许直接序列化?
  2. 在我的示例中,私有访问修饰符肯定不允许直接访问它的值吗?我在这里使用 private 访问修饰符的理解中遗漏了什么?

我已经阅读了很多关于处理序列化的不同方式的其他文章和 StackOverflow 帖子,想要阻止“如何”,而是就所提到的行为询问“为什么”。

任何反馈将不胜感激! :)

亲切的问候

【问题讨论】:

  • “建议使用具有下划线前缀的私有成员创建对象定义”我还没有找到任何相关信息。为什么你认为这是建议的?我认为你的意思是他们使用 _ 前缀来避免与 getter/setter 的命名勾结。这不同于 Angular 建议不要将 _ 用于私人成员。
  • 嘿@GünterZöchbauer! :) 是的,这正是我发现的,由于命名共谋,我无法实现任何访问​​器/突变器。我理解那里的区别,但找不到任何建议在此实例中实现访问器和修饰符的 Angular 文档

标签: angular typescript serialization


【解决方案1】:

您可以通过实现toJSON()来自定义序列化

public class Foo{
    private _bar:string;

    constructor(){ this._bar='Baz'; }

    get bar():string{return this._bar}

    toJSON() {
      return {bar: _bar};
    }

    static fromJSON(json) {
      ...
    }
}

另见http://choly.ca/post/typescript-json/

Getter 和 setter 是纯 TypeScript 语言特性,与 Angular 完全无关。

private 仅用于 TypeScript 中的静态分析。当它被转译为 JS 时,private 将不复存在。它变成了一个普通的旧 JS 对象,JSON.stringify 就这样对待它。

【讨论】:

  • 可能是我要解决我的问题的路线,但我真的想更多地了解访问器/突变器的 Angular 实现(如果any) 和可访问性修饰符在此处使用
  • 我在这里没有看到任何与 Angular 相关的内容。 Angular (2 - 4) 没有任何访问器或修改器。如果您谈论的是 AngularJS 1.x,那么您应该将标签从 angular 更改为 angularjs
  • 哦,真的吗?我完全没有注意到这一点——我假设 angular 2.x+ 确实建议使用访问器和突变器。您是否有任何消息来源知道引发讨论以消除此问题的来源?
  • private 仅用于 TypeScript 中的静态分析。当它被转译为 JS 时,private 不存在。它只是一个普通的旧 JS 对象。
  • Getter 和 setter 是纯 TS,与 Angular 完全无关。 Angular 团队不必在这里做任何决定。抱歉,我不明白误会在哪里以及如何提供更好的答案。
猜你喜欢
  • 2018-04-30
  • 2017-12-15
  • 2019-02-03
  • 1970-01-01
  • 2021-09-30
  • 2012-05-18
  • 1970-01-01
  • 2018-04-09
  • 2016-08-09
相关资源
最近更新 更多