У меня есть множество перечислений в моем приложении 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.
Любой совет будет очень признателен. Заранее спасибо!