Предположим, у нас есть отдых api по этому адресу /api/stuffs/
, где мы можем получить список Stuff
.angular2 & typescript & reactiveX: как отличить http получить результат
вот код HTTP получить список Stuff
:
getStuffs(): Observable<Stuff[]> {
return this.http.get(this.url)
.map(this.extractStuffs)
.catch(this.handleError);
}
private extractStuffs(res: Response) {
let stuffs = res.json() as Stuff[];
return stuffs || new Array<Stuff>();
}
все работает отлично с этим кодом, за исключением того факта, что stuffs
массива в функции extractStuffs
не массив Stuff
, но и массив Object
, даже если сигнатура функции равна Observable<Stuff[]>
, а результат от api отличен до Stuff[]
. Что странно, что машинопись компилятор не бросает какую-либо ошибку (даже если тип результата отличается от подписи), ведьма совершенно нормально, если мы посмотрим на сгенерированный JS файл:
StuffService.prototype.extractStuffs = function (res) {
var stuffs = res.json();
return stuffs || new Array();
};
Так, очевидно, литье результат в Stuff[]
даже не рассматривается компилятором.
Есть ли способ сделать это правильно, не делая это вручную?
Спасибо.
опущено, чтобы сказать, что однократное литье объект не работая либо, ' stuffJson' по-прежнему возвращает' Object' вместо 'Stuff'. здесь создается сгенерированный js => 'jsonStuffs.forEach (function (jsonStuff) {return stuffs.push (jsonStuff);});' может ли что-то отсутствовать в моем компиляторе ??? –
dafriskymonkey
Наверное, для того, чтобы кастинг работать должен быть интерфейсом (а не классом). Это с тобой дело? – Picci
его класс действительно. плохо повторить с интерфейсом. – dafriskymonkey