假设我在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的结果转换为各自的类型?
答案 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)