Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在angular2项目中访问typescript对象的属性时返回undefined?_Angular_Typescript - Fatal编程技术网

为什么在angular2项目中访问typescript对象的属性时返回undefined?

为什么在angular2项目中访问typescript对象的属性时返回undefined?,angular,typescript,Angular,Typescript,我有一个angular2项目,其中我使用http模块发出get请求。该对象是从服务器检索的,并且显然被反序列化为其相应的typescript对象,但是当我尝试访问属性时,它返回未定义的,即使在尝试访问这些属性之前将对象打印到控制台时,数据似乎存在 这就是我的get请求方法的样子 getDataForEmployee(data){ var url = this.active+"/guest/"+data; var headers = new Headers(); h

我有一个angular2项目,其中我使用http模块发出get请求。该对象是从服务器检索的,并且显然被反序列化为其相应的typescript对象,但是当我尝试访问属性时,它返回未定义的,即使在尝试访问这些属性之前将对象打印到控制台时,数据似乎存在

这就是我的get请求方法的样子

  getDataForEmployee(data){
    var url = this.active+"/guest/"+data;

    var headers = new Headers();

    headers.append("Content-Type", "application/json");

    return this.http
      .get(url, {headers:headers})
      .toPromise()
      .then((res:Response)=> res.json() as Employee);

  }
这就是处理响应的方法的外观

this.employeeHttp.getDataForEmployee(userid)
  .then((employee:Employee)=>{
    console.log(employee);
    console.log("firstname: "+employee.firstName);
    ...
Employee类如下所示:

 export class Employee {

    ...
      private _firstName:string;
    ...

      get firstName(): string {
        return this._firstName;
      }

      set firstName(value: string) {
        this._firstName = value;
      }

    ...
    }
此图显示发出此请求时的控制台输出。

我不明白为什么当我试图检索firstName时,它返回未定义的,即使它之前就存在于对象中


任何关于为什么会发生这种情况的想法都会对我很有帮助。

只有通过继承才能实现您的期望。但是将对象的类型声明为类不会使对象继承类,即
employee
不是代码中
employee
的子对象

要调用getter,您必须首先继承它,例如:

let emp = new Employee("Dan"); // passing only firstName for demo
然后您将能够访问
emp.firstName
,它将返回
Dan
。您还需要接受
Employee
类中的参数

我做了一个演示,
Employee
类接受firstName的一个参数。保持开发人员工具处于打开状态,以便它在getter和setter中都停止


由于typescript仅在编译类型检查代码,因此无法检查API是否在运行时返回了其他内容,例如:
\u name
而不是
\u firstName
。因此,我建议在您的情况下使用
接口
而不是

您所期望的只有通过继承才能实现。但是将对象的类型声明为类不会使对象继承类,即
employee
不是代码中
employee
的子对象

要调用getter,您必须首先继承它,例如:

let emp = new Employee("Dan"); // passing only firstName for demo
然后您将能够访问
emp.firstName
,它将返回
Dan
。您还需要接受
Employee
类中的参数

我做了一个演示,
Employee
类接受firstName的一个参数。保持开发人员工具处于打开状态,以便它在getter和setter中都停止


由于typescript仅在编译类型检查代码,因此无法检查API是否在运行时返回了其他内容,例如:
\u name
而不是
\u firstName
。因此,我建议在您的案例中使用
接口
而不是

在屏幕截图中,我看到_firstName您是否尝试过console.log(“firstName:+employee._firstName”);另外,不相关但GET请求没有内容(正文),因此发送内容类型标头没有任何意义。@Dhyey我已经尝试过了,这是可行的,但我不喜欢这样做,因为这样我必须将属性设置为公共属性,这意味着我直接访问属性,而不是使用getter和setter,这似乎是与typescript对象交互的正确方式。@JBNizet感谢您的帮助tip@Dan从AJAX响应接收对象时,它是转换为javascript对象的简单JSON字符串。它没有getter和setter,也就是说,它不是一个类,只是我看到的屏幕截图中的简单数据_firstName是否尝试过console.log(“firstName:+employee._firstName”);另外,不相关但GET请求没有内容(正文),因此发送内容类型标头没有任何意义。@Dhyey我已经尝试过了,这是可行的,但我不喜欢这样做,因为这样我必须将属性设置为公共属性,这意味着我直接访问属性,而不是使用getter和setter,这似乎是与typescript对象交互的正确方式。@JBNizet感谢您的帮助tip@Dan从AJAX响应接收对象时,它是转换为javascript对象的简单JSON字符串。它没有getter和setter,也就是说它不是一个类,只是一个简单的数据。谢谢,你的解释很有帮助。谢谢,你的解释很有帮助。