TypeScript: полное имя класса
Подскажите, как обратиться к классу по его полному имени в TypeScript. В самом простом случае, есть два класса:
namespace API { export class SomeUnit { } } namespace UI { export class SomeUnit { } }И далее, в каком-то другом классе, мне нужно создать экземпляры обоих этих классов по их полному (включая namespace) имени, т.е.: var apiUnit = new API.SomeUnit(); var uiUnit = new UI.SomeUnit(); Причём, вопрос актуален даже в тех случаях, когда нет пересечения по самим именам классов в разных пространствах имён, т.к. если где-то в коде встречается: var company = new Company(); То вот в таком виде из кода совершенно не очевидно, что это за 'Company'. Вот если там будет что-то типа: var company = new API.DTO.Company(); var company = new UI.Model.Company();То при чтении кода не придётся ходить в другие файлы, читать комментарии или пытаться из пути файла вывести, к какому вообще блоку логики этот класс относится. P.S.: да, это шапровская привычка, но это реально упрощает чтение кода и хочется в TS получить хоть что-то похожее. Пока у меня только одна идея - весь неймспейс вписывать в качестве префикса имени класса с разделителем через заглавные буквы. Но это так себе решение, т.к. имена классов очень уж громоздкие получаются. |
Получился следующий вариант - экспорт нэймспейса, внутри нэймспейса экспорт тех классов, что требуются снаружи и приватное описание тех классов, что нужны только для локального использования.
Например: export namespace HintApi { @Injectable() export class HintService { constructor(private httpClient: HttpClient, private appConfig: AppConfig) { } searchCompanyByPartial(searchText: string): Observable<SearchCompanyByPartialResponse> { var request = new SearchCompanyByPartialRequest(searchText); return this.httpClient.post<SearchCompanyByPartialResponse>("hint/searchCompanyByPartial", request); } } class SearchCompanyByPartialRequest { searchText: string; constructor(searchText: string) { this.searchText = searchText; } } class SearchCompanyByPartialResponse { public companies: SharedDto.Company[]; } А в тех местах, где требуется использовать данный набор функционала: import { HintApi } from "../../../api/hint.api" constructor( private fb: FormBuilder, private apiHintService: HintApi.HintService) { .... Если в нужном нэймспейсе есть какие-то классы, описывающие структуры данных, то к ним обращение идёт так же через импортированный алиас: var someHintDto = new HintApi.SomeDto(); |
Часовой пояс GMT +3, время: 13:25. |