Búsqueda de sitios web

angular - Especificando el tipo de retorno en un método de Typescript de Angular2


Tengo un método de acceso a datos en el que utilizo map para transformar un hash en un array para poder iterar sobre ellos en mi vista:

public getCrawlsStatuses():Observable<ICrawlsStatus[]> {

        let _statusesURL:string = `${this.API_URL}/crawl_statuses`;

        return this._http.get(_statusesURL)
            .map((res:Response) => {
                let statuses:ICrawlsStatus[] = [];
                Object.keys(res.json()).map(key => {
                    statuses.push({
                        name: key,
                        total: res.json()[key]
                    })
                });
                return statuses;
            })
            .catch(CrawlsService.onError);
    }

Sin embargo, encuentro que los estados de las variables son un poco redundantes, así que decidí acortar el mapeo simplemente utilizando el retorno del método map del observable:

public getCrawlsStatuses():Observable<ICrawlsStatus[]> {

        let _statusesURL:string = `${this.API_URL}/crawl_statuses`;

        return this._http.get(_statusesURL)
            .map((res:Response) => {
                return Object.keys(res.json()).map(key => {
                    return {
                        name: key,
                        total: res.json()[key]
                    }
                });
            })
            .catch(CrawlsService.onError);
    }

En términos de verificación de tipos, esto funciona bien para los componentes fuera de aquí, ya que necesitan esperar crawlsStatuses: ICrawlsStatus[];, pero por más que lo intento no puedo encontrar una manera de hacer que el objeto devuelto tenga un tipo internamente también, algo como:

return <ICrawlsStatus>{
  name: key,
  total: res.json()[key]
}

Me gustaría obtener un error si las claves devueltas no coinciden con mi interfaz. Por ejemplo, nombres, totalmente...

Respuesta #1

Pero por más que lo intento no puedo encontrar una manera de hacer que el objeto devuelto tenga un tipo internamente también, algo como

Simplemente crea una variable local:

const result: ICrawlsStatus = {
  name: key,
  total: res.json()[key]
}
return result;

Más

Deberías evitar la aserción de tipos tanto como puedas: https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html