为什么在angular2项目中访问typescript对象的属性时返回undefined?
我有一个angular2项目,其中我使用http模块发出get请求。该对象是从服务器检索的,并且显然被反序列化为其相应的typescript对象,但是当我尝试访问属性时,它返回未定义的,即使在尝试访问这些属性之前将对象打印到控制台时,数据似乎存在 这就是我的get请求方法的样子为什么在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
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,也就是说它不是一个类,只是一个简单的数据。谢谢,你的解释很有帮助。谢谢,你的解释很有帮助。