Typescript 铸造而不是铸造

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调用:

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;
  }
}