Angular 6 HttpClient 返回类的实例

11

在angular引入新的HttpClient之前,我们从http api调用返回的对象可以使用instanceof关键字进行验证。但是,在使用HttpClient模块后,不能再这样验证了。我正在尝试一些简单的方法,但类型检查每次都返回false。

期望的行为是:

```

getCow() {
    return this.http.get<Cow>(ApiRoute.GET_COW, options)
        .map(res => res as Cow)
        .toPromise()
        .then((c: Cow) => {
            console.log(c instanceof Cow); //this is false
        })
}

```

would return true. does anyone know of a simple way to new up an instance behind the scenes of the http client?


返回true。有没有人知道在Http客户端背后创建一个实例的简单方法?


什么是 Cow?你需要使用 new 来构建它,并用 cow 属性进行初始化。这不是 Angular 或 TS 可以为你处理的东西。 - Estus Flask
1
以上只是一个虚构的例子。为了这个问题,“Cow”是一个没有属性和默认构造函数的类。 - Scott Clark
那么res包含什么?这意味着它可以被丢弃吗? - Estus Flask
你之前是如何创建 Cow 类的实例的?你应该可以用同样的方式来创建。 - David
1
我认为StackOverflow上的任何解决方案都不是该问题的全面解决方案。 因此,我创建了一个npm包angular-http-deserializer用于此: https://www.npmjs.com/package/angular-http-deserializer#usage - Jeff Fischer
显示剩余2条评论
1个回答

12
TypeScript使用结构类型,即 c 对象不必是Cow的实例就可以符合Cow类型。 TypeScript类型仅存在于编译时,并且不以任何方式影响JS输出(除了用于Angular DI的已发出类型之外)。 as Cow 断言 res 符合 Cow 类型,而 instanceof Cow 期望 c 是 Cow 类的实例。由于Cow未被实例化,因此cow instanceof Cow为false。类应该设计支持水合(可能通过构造函数参数),并明确实例化:
class Cow {
  sound: string;
}

return this.http.get<Cow>(ApiRoute.GET_COW, options)
    .map(res => Object.assign(new Cow(), res as Cow))
    .toPromise()
    .then((c: Cow) => {
        console.log(c instanceof Cow);
    })

如果需要使用一些逻辑从普通对象构造Cow实例(例如验证、嵌套对象构造),可以在类构造函数或单独的帮助函数中完成此操作(例如Cow静态方法)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接