如何使用TypeScript在Angular 2中返回相关对象

时间:2016-10-17 19:43:14

标签: angular typescript ecmascript-6

抱歉,我是TypeScrit和Angular 2的新手,对不起我的英语不好,这不是我的母语。但我需要你的帮助。

我有这个数据模型:

country.ts

export class Country{
    id: number;
    name: string;
}

state.ts

export class State{
    id: number;
    name: string;
    country_id: number
}

city.ts

export class City{
    id: number;
    name: string;
    state_id: number
}

我有很多国家,与一些州有关,这些与一些城市有关,例如:EEUU - >佛罗里达州 - >奥兰多

用户选择第一个国家/地区,在下一步中,必须选择与该国家/地区相关的一个州,最后一步选择与此州相关的一个城市。

目标是使用此数据完成<select></select>标记,但我无法创建返回数据的方法。

我尝试了这个,但是我有这个错误“类型'承诺'不能在”getCitiesRefState“方法中指定类型'Promise',它类似于”getCity()“,但这很好。

我的代码是:

模拟data.ts

import { Country } from './country';
import { State } from './state';
import { City } from './city';

export const PAIS: Pais[] = [
  {id: 1, name: 'EEUU'}
];

export const PROVINCIA: Provincia[] = [
  {id: 1, name: 'Florida', pais_id: 1},
  {id: 2, name: 'Georgia', pais_id: 1},
  {id: 3, name: 'Alabama', pais_id: 1}
];

export const LOCALIDAD: Localidad[] = [
  {id: 1, name: 'Orlando', provincia_id: 1},
  {id: 2, name: 'Tampa', provincia_id: 1},
  {id: 3, name: 'Gainesvielle', provincia_id: 1}
];

city.service.ts

import { Injectable } from '@angular/core';
import { City } from './city';
import { CITY } from './mock-data';
@Injectable()
export class CityService{
    getCities(): Promise<City[]> {
        return Promise.resolve(CITY);
    }
    getCitiesRefState(id: number): Promise<City[]> {
        return this.getCities().then(cities=> cities.find(city => city.state_id === id));
    }
    getCity(id: number): Promise<City> {
        return this.getCities()
        .then(cities => cities.find(city=> city.id === id));
    }
}

1 个答案:

答案 0 :(得分:1)

宣布您的getCitiesRefState方法返回Promise<City[]>但实际上返回Promise<City>。它有助于了解我们是否扩展了该方法。

getCitiesRefState(id: number): Promise<City[]> {
    return this.getCities()
        .then(cities=> {
            // cities.find() will return a City, not a City[]
            return cities.find(city => city.state_id === id)
        });
}

至于你的<select>,你需要提供更多代码来展示那里发生的事情。