【问题标题】:Instantiating array of objects from JSON [duplicate]从 JSON 实例化对象数组 [重复]
【发布时间】:2016-03-28 20:37:12
【问题描述】:

我对 Typescript 很陌生,所以我想这是一个非常愚蠢的问题,但我有一个 JSON 对象数组,我想映射到 Panel 类。

当我的PanelsService 类被实例化时,我还想实例化我的Panel 对象数组。

到目前为止我得到了什么:

PanelsService.ts

import {Panel} from './panel';

declare var _: any;

export class PanelsService {

  public panels: Array<Panel>;
  public customPanels: Array<Panel>;

  constructor(private _http:Http) {
    this.panels = window['panels']['views'];
  }
}

由此,我的Panels 都没有被实例化(我在构造函数中有一个日志)。显然我可以遍历window['panels']['views'] 并执行类似this.panels.push(new Panel(myPanel) 的操作,但似乎必须有更好的方法。

FWIW,我的 Panel 类只是一个属性负载和一个构造函数。

【问题讨论】:

  • 仅供参考:您可以使用较短的 Panel[] 代替 Array&lt;Panel&gt;。

标签: javascript typescript


【解决方案1】:

如果window['panels']['views'] 中的数据是一个Panel 数组,你只需要强制转换它就可以让TypeScript 满意:

this.panels = <Panel[]>(window['panels']['views']);

这不会改变生成的 javascript 的任何内容,但会编译。
请注意,它永远不会调用 Panel 构造函数。 window['panels']['views'] 中的对象已经实例化,所以它只是一个演员表。

【讨论】:

  • 如果我想从 JSON 实例化一堆类,除了循环和推送之外,是否缺少某种模式?这似乎是一个相当常见的用例 - 例如,当我实例化类时,我想在包含原始属性值的实例上存储一个对象。
  • JSON 是一个 javascript 对象。它已经“有点”实例化了。如果它看起来像你想要的对象,你不需要做太多。如果需要,您始终可以根据 JSON 数据实例化您自己的对象,但这需要手动映射是的。如果您不想推送和循环,可以使用 .map() 和 .filter() 等函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多