在Angular 2中从域模型实例化新的类型对象

时间:2016-05-29 10:29:17

标签: typescript angular

每当我尝试从我的域模型中实例化一个新对象时,使用TypeScript的My Angular 2(RC)应用程序都会中断错误:

  

错误:TypeError:无法读取属性' prototype'未定义的(...)

export class Reservation {
    public ReservationId: number;
    public SeatingId: number;
    public EventId: number;

    // ...

    constructor() {}
}

然后在我的组件中使用:

import { Reservation } from '../models/models';
....
let booking = new Reservation();

这个和其他模型对象由http服务实例化而没有问题,作为参数传递,并且通常在整个应用程序中使用 - 所有这些都没有问题,但是我添加" new Reservation()"在应用程序中的任何地方我收到此错误。

我已经看过很多使用这种语法的例子,我也试图创建一个可注入的工厂服务来返回新对象,以及我能想到的其他方式,但无论在哪里我的应用程序我添加此行它在bootstrap期间中断。在构建期间没有显示TypeScript错误或任何内容。

更新: 似乎问题只发生在从另一个文件导入的类中。我创建了一个虚拟示例,当该类与我的组件在同一个文件中时,它可以工作,但如果该类是从另一个文件导入的,那么它就没有了,即它可以工作:

import { Component, OnInit } from '@angular/core';
//import { Foo } from '../models/models';
export class Foo {
    public Name: string;
    public Score: number; 
}

@Component({
    selector: 'foo',
    template: `
        <h1>{{bar.Name}}</h1>
    `,
    directives: []
})
export class FooComponent implements OnInit {
    bar : Foo; 
    constructor() { }
    ngOnInit() {
        this.bar = new Foo();
        this.bar.Name = "Foobar";
    }
}

这不是:

import { Component, OnInit } from '@angular/core';
import { Foo } from '../models/models';

@Component({
    selector: 'foo',
    template: `
        <h1>{{bar.Name}}</h1>
    `,
    directives: []
})
export class FooComponent implements OnInit {
    bar : Foo; 
    constructor() { }
    ngOnInit() {
        this.bar = new Foo();
        this.bar.Name = "Foobar";
    }
}

在这两种情况下,Foo类都是相同的。文件的路径也是正确的。我的编辑器是VS Code,没有构建错误或解析导入的类,或者以新Foo()之外的任何其他方式使用类;

更新2:

我发现我的ts文件中的import语句没有转换为相应编译的js文件中的require语句,因此编译为models.js的我的models.ts不会被浏览器加载,我和#39;猜测可以解释为什么我不能实例化其中包含的任何类。

更新3:

上次更新可能是红鲱鱼。如果我尝试注入我想在组件构造函数中使用的类,则在js文件中根据需要添加models.js并由浏览器加载,但是会发生完全相同的错误。

1 个答案:

答案 0 :(得分:0)

我有类似的问题。我解决它的方法是将默认值设置为变量。

export class Reservation {
  public ReservationId: number = null;
  public SeatingId: number = null;
  public EventId: number = null;

  // ...

  constructor() {}
}