将Observable.forkJoin的结果转换为Angular 2中的各自类型

时间:2017-07-25 14:30:17

标签: angular typescript rxjs

假设我在Angular 2中有一个组件需要在显示页面之前从服务器加载2个不同的东西。当他们回来告诉页面isLoaded = true时,我想要触发所有这些事情并调用一个事件处理程序。假设我有一个看起来像这样的服务类。

aggregate(id2 ~ id1, FUN=toString, subset(df, ave(id1, id1, FUN=seq_along) <= num))
#  id1                       id2
#1  17       13107, 21463, 38777
#2  34 16083, 39475, 47766, 2596

然后我有一个使用该服务类的组件。

export class MyService {
   getStronglyTypedData1(): Observable<StrongData1[]>{
      return this.http.get('http://...').map((response:Response) => <StrongData1[]>response.json());
   }
   getStronglyTypedData2(): Observable<StrongData2[]>{
         return this.http.get('http://...').map((response:Response) => <StrongData2[]>response.json());
   }
}

TypeScript编译器抱怨它无法将类型对象转换为类型StrongData1 []。如果我将StrongData1和StrongData2更改为“any”,一切正常。我宁愿不这样做,因为我正在失去TypeScript强大的打字的好处。

如何将forkJoin的结果转换为各自的类型?

3 个答案:

答案 0 :(得分:18)

对我来说,当我直接将请求添加到Observable.forkJoin然后使用es6 destructing结果数组时,它总是有效。

所以你的代码看起来像这样

Observable
    .forkJoin(this.myService.getStronglyTypedData1(), this.myService.getStronglyTypedData2())
    .subscribe(
        ([typeData1, typeData2]) => {
            this.stronglyTypedData1 = typeData1;
            this.stronglyTypedData2 = typeData2;
            this.isLoaded = true;
        }
    );

答案 1 :(得分:3)

(results:[StrongData1[], StrongData2[]]) =>

答案 2 :(得分:1)

在 Typescript 中,您可以对函数参数(本例中为元组)使用解构:

class Cylindar:
    def __int__(self,r,h):
        self.__r=r
        self.__h=h


    def calc_area(self):
     return self.r*2*3.14*h+2*3.14*r**r


    def calc_volume(self):
     return self.h*3.14*r**r*h


    def __str__(self):
        return "Cylinder with raduis="+str(self.r)

    def __del__(self):
        print("Deliting Cylinder with radius=",self.r,".")

    @property
    def r(self):
        return self._r
    @r.setter
    def r(self, r):
        if r<=0:
            print("Cylinder can't have negative radius")
        else:
            self._r=r

c.calc_area()
c.calc_volume()


print(c)