2016-10-19 1 views
0

Предположим, у нас есть отдых 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[] даже не рассматривается компилятором.

Есть ли способ сделать это правильно, не делая это вручную?

Спасибо.

ответ

0

Каждый раз, когда я нахожусь в подобной ситуации, я выполняю цикл (который, как я полагаю, вы определяете вручную).

Это пример с клиентами вместо набивает

getCustomers(code: string) { 
     let url = environment.baseServicesUrl + 'customer'; 
     let jsonParam = {code: code}; 
     return this.http.post(url, jsonParam, this.getOptions()) 
        .map(this.extractData) 
        .map((customerJsons) => { 
         let customers = new Array<Customer>(); 
         customerJsons.forEach((customerJson) => { 
          customers.push(<Customer>customerJson); 
         }) 
         return customers 
        }) 
        .catch(this.handleError); 
    } 

Тип отливка Клиент является интерфейс.

Вот код Customer.interface.ts

import {Relationship} from './relationship.interface'; 

export interface Customer { 
    customerId: string; 
    name: string; 
    lastName: string; 
    code: string; 
    relationships: Array<Relationship>; 
} 

Вот код для Relationship.interface.ts

export interface Relationship { 
    id: string; 
    type: string; 
} 
+0

опущено, чтобы сказать, что однократное литье объект не работая либо, ' stuffJson' по-прежнему возвращает' Object' вместо 'Stuff'. здесь создается сгенерированный js => 'jsonStuffs.forEach (function (jsonStuff) {return stuffs.push (jsonStuff);});' может ли что-то отсутствовать в моем компиляторе ??? – dafriskymonkey

+0

Наверное, для того, чтобы кастинг работать должен быть интерфейсом (а не классом). Это с тобой дело? – Picci

+0

его класс действительно. плохо повторить с интерфейсом. – dafriskymonkey

Смежные вопросы