2016-06-18 3 views
0

У меня есть множество перечислений в моем приложении Angular2, и для каждого перечисления я создал соответствующий класс utils, который предоставляет некоторые дополнительные функции. Это просто ограничивает ограничение типа TypeScript, что я не могу добавить функции в enum так же, как я могу это сделать в Java.Angular2 и TypeScript enums - dos and don'ts

Вот пример моей страны перечисления и соответствующий Utils класс:

import {Injectable} from "@angular/core"; 

export enum Country { 
    ANDORRA = <any>"ANDORRA", 
    UNITED_ARAB_EMIRATES = <any>"UNITED_ARAB_EMIRATES", 
    AFGHANISTAN = <any>"AFGHANISTAN", 
    // ... 
    // more countries skipped for brevity 
    // ... 
    ZAMBIA = <any>"ZAMBIA", 
    ZIMBABWE = <any>"ZIMBABWE" 
} 


@Injectable() 
export class CountryUtils { 

    private _emptyEntry: Array<string> = ["", "", ""]; 

    private countryData: any = { 
     ANDORRA: ["Andorra", "AD", "AND"], 
     UNITED_ARAB_EMIRATES: ["United Arab Emirates", "AE", "ARE"], 
     AFGHANISTAN: ["Afghanistan", "AF", "AFG"], 
     // ... 
     // more countries skipped for brevity 
     // ... 
     ZAMBIA: ["Zambia", "ZM", "ZMB"], 
     ZIMBABWE: ["Zimbabwe", "ZW", "ZWE"] 
    } 

    getData(country: Country): any { 
     if (!country) { 
      return this._emptyEntry; 
     } 
     return this.countryData[Country[country]]; 
    } 

    getName(country: Country): any { 
     return this.getData(country)[0]; 
    } 

    getCode2(country: Country): any { 
     return this.getData(country)[1]; 
    } 

    getCode3(country: Country): any { 
     return this.getData(country)[2]; 
    } 
} 

Теперь, как вы можете видеть, я пометил класс Utils, как и инъекционные, так что я могу использовать его с DI, где мне нужно Это.

Проблема, с которой я сталкиваюсь, заключается в том, что эти перечисления также используются в моих основных классах классов TS/JS, которые не зависят от Angular2, поэтому я не могу использовать DI для ввода экземпляра моих классов utils (например,) внутри классов основных моделей.

Единственное, что я вижу, это отказаться от подхода Injectable() и пометить методы в классах utils как статические. Таким образом, я могу просто импортировать каждый класс utils вместе с перечислением и использовать его в любом месте.

Вопрос в том, насколько плохим было бы решение по дизайну? Допустимо ли делать что-то подобное в Angular2 или использовать статику в полном нет-нет? Я не вижу ничего особенно вредного для других, что это похоже на боль в глазах по сравнению с обычным подходом DI.

Любой совет будет очень признателен. Заранее спасибо!

ответ

0

Я не вижу статический класс как проблему. Кроме того, вы можете использовать Declaration Merging, чтобы добавить функциональность вашего использования к вашему перечислению. Нет необходимости в дополнительном классе. Проверьте ниже.

enum Country { 
    ANDORRA = <any>"ANDORRA", 
    UNITED_ARAB_EMIRATES = <any>"UNITED_ARAB_EMIRATES", 
    AFGHANISTAN = <any>"AFGHANISTAN", 
    // ... 
    // more countries skipped for brevity 
    // ... 
    ZAMBIA = <any>"ZAMBIA", 
    ZIMBABWE = <any>"ZIMBABWE" 
} 

namespace Country { 

    const _emptyEntry: Array<string> = ["", "", ""]; 

    const countryData: any = { 
     ANDORRA: ["Andorra", "AD", "AND"], 
     UNITED_ARAB_EMIRATES: ["United Arab Emirates", "AE", "ARE"], 
     AFGHANISTAN: ["Afghanistan", "AF", "AFG"], 
     // ... 
     // more countries skipped for brevity 
     // ... 
     ZAMBIA: ["Zambia", "ZM", "ZMB"], 
     ZIMBABWE: ["Zimbabwe", "ZW", "ZWE"] 
    }; 

    export function getData(country: Country): any { 
     if (!country) { 
      return this._emptyEntry; 
     } 
     return this.countryData[Country[country]]; 
    } 

    export function getName(country: Country): any { 
     return this.getData(country)[0]; 
    } 

    export function getCode2(country: Country): any { 
     return this.getData(country)[1]; 
    } 

    export function getCode3(country: Country): any { 
     return this.getData(country)[2]; 
    } 
} 

Country.getCode2(Country.AFGHANISTAN); 
Смежные вопросы