Typescript 铸造而不是铸造
我做了一个简单的Http调用:Typescript 铸造而不是铸造,typescript,angular,Typescript,Angular,我做了一个简单的Http调用: http.get('/test/data/user.json'). map(res => <User> res.json()). subscribe(user => { console.log(typeof user); console.log(user); console.log(user.getName()); }); 以及以下用户类: export class User
http.get('/test/data/user.json').
map(res => <User> res.json()).
subscribe(user => {
console.log(typeof user);
console.log(user);
console.log(user.getName());
});
以及以下用户
类:
export class User{
name:string;
lastName:string;
getName():string{
return this.name;
}
}
问题是我在控制台中得到的结果:
console.log(typeof user);
反对
对象{name:“Robert”}
未捕获的TypeError:user.getName不是函数
问题
这里的问题是,我的对象是一个对象
,而不是用户
,因此它没有所有属性,也没有方法
还尝试使用基于承诺的调用和user.json()作为用户,而不是res.json()
编辑:与强制转换到接口不同,因为接口没有自己的行为。如果要使用getName
方法,则需要在映射响应主体时实例化一个新的User
对象:
http.get('/test/data/user.json').
map(res => {
let body = res.json();
return new User(body.name, body.lastName);
})
subscribe(user => {
console.log(typeof user);
console.log(user);
console.log(user.getName());
});
User
类将进行如下调整:
export class User{
constructor(private name:string, private lastName:string) {}
getName():string{
return this.name;
}
}
强制转换对象不会向现有对象添加方法。响应的json
方法将使用json.parse
简单地解析响应体并返回一个原始对象
请看这个plunkr:。Typescript只是一个编译时类型检查器,它在运行时不起作用……我知道,但是对象应该有lastName属性。您需要的是类似于subscribe(userObj=>let user=new user(userObj))的东西
您实际将对象转换为用户类的位置。只有当lastName属性出现时,它才具有lastName属性。可能重复
console.log(user.getName());
http.get('/test/data/user.json').
map(res => {
let body = res.json();
return new User(body.name, body.lastName);
})
subscribe(user => {
console.log(typeof user);
console.log(user);
console.log(user.getName());
});
export class User{
constructor(private name:string, private lastName:string) {}
getName():string{
return this.name;
}
}