Angular 函数未定义在TypeScript中具有角度2的组件引用的普通对象上

Angular 函数未定义在TypeScript中具有角度2的组件引用的普通对象上,angular,typescript,undefined,Angular,Typescript,Undefined,我有一个角度分量和普通类 普通类上定义了一个枚举,如下所示: export class ShieldRequest { state: ShieldRequest.StateType; stateAsString(): string { return ShieldRequest.StateType[+this.state]; } } export module ShieldRequest { export enum StateTy

我有一个角度分量和普通类

普通类上定义了一个枚举,如下所示:

export class ShieldRequest {    
    state: ShieldRequest.StateType;    

    stateAsString(): string {
        return ShieldRequest.StateType[+this.state];
    }
}

export module ShieldRequest {
    export enum StateType {
        Untouched = 0,
        Rejected = 1,
        Accepted = 2
    }
}
我需要我的组件能够引用此对象的状态字段。但它需要字符串表示,因此需要stateAString()方法

我的组件如下所示:

import { Component, OnInit, Input } from '@angular/core';

import { ShieldRequest } from './shield-request';

@Component({
    moduleId: module.id,
    selector: 'shield-request',
    templateUrl: 'shield-request.component.html'
})
export class ShieldRequestComponent implements OnInit {
    @Input()
    shieldRequest: ShieldRequest;

    constructor() { }

    ngOnInit() { }

    get state(): string {
        return this.shieldRequest.stateAsString(); // throws not defined...
        // return ShieldRequest.StateType[+this.shieldRequest.state]; // works fine!
    }
}
如上面的注释所示,state属性的第一行抛出一个异常,即函数未定义,但第二行可以正常工作。错误如下所示:

EXCEPTION: Error in http://localhost:3000/app/shield-request.component.html:8:52 caused by: this.shieldRequest.stateAsString is not a function
我曾尝试在网上搜索,以找出发生这种情况的原因,但似乎找不到相关信息。有人能解释一下为什么会发生这种情况吗

编辑: 以下是ShieldRequest对象在服务中的实例化方式:

 import { Injectable } from '@angular/core';
 import { Http } from '@angular/http';
 import { Observable } from 'rxjs';
 import 'rxjs/Rx';

 import { ShieldRequest } from './shield-request';

@Injectable()
export class ShieldRequestService {
    private apiUrl: string = 'http://localhost:24576/api/';
    private resourceUrlPart: string = 'request/';

    constructor(private http: Http) { }

    getAllRequests(): Observable<ShieldRequest[]> {
        return this.http.get(this.apiUrl + this.resourceUrlPart).map(response => response.json() as ShieldRequest[]);
    }
}
最后,在这里您可以看到如何创建屏蔽请求组件和传递输入(这是get.component.html文件):


正在加载请求。。。

您已将SheildRequest定义为模块和类:

export class ShieldRequest

export module ShieldRequest
如果它们在同一个文件中,那就是你的问题。导入时:

import { ShieldRequest } from './shield-request';

谁知道你在进口什么。即使不是这样,也不要用相同的名称命名两个对象。

您确定要通过的对象是实际类型的
@Input
。其他一切似乎都很好是的,如第2个代码块中的注释所示,第2行可以很好地访问通过
@Input
传入的本地
ShieldRequest
对象。我不是TypeScript专家,但您使用的名称
ShieldRequest
看起来模棱两可。您确定在导入ShieldRequest时,在同一个文件中得到的是具有相同名称的类而不是模块吗?老实说,我也是这样,但如果是这样的话,我似乎无法像现在这样使用对象的实例。我也无法在我的代码中使用静态定义的enum
StateType
,因此我唯一的结论是导入类型会同时导入文件的模块和类部分。我认为shieldRequest不是shieldRequest的实例。可以显示什么是传递的输入吗?但是我可以在同一个类中使用枚举值和对象定义。我的模块只是定义不能在类中定义的静态枚举。我将尝试一下,然后标记它,如果它修复了它。干杯。我想我不是在用同一个名字命名两个物体吗?一个是模块(一个静态声明容器),另一个是类(一个对象的蓝图)。我明白你的意思,但我认为你这样做会得到意想不到的行为。我也可能错了。
export class ShieldRequest

export module ShieldRequest
import { ShieldRequest } from './shield-request';