Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.12.2018, 12:13
Интересующийся
Отправить личное сообщение для kotelok Посмотреть профиль Найти все сообщения от kotelok
 
Регистрация: 27.08.2018
Сообщений: 19

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 получить хоть что-то похожее. Пока у меня только одна идея - весь неймспейс вписывать в качестве префикса имени класса с разделителем через заглавные буквы. Но это так себе решение, т.к. имена классов очень уж громоздкие получаются.

Последний раз редактировалось kotelok, 18.12.2018 в 12:35.
Ответить с цитированием
  #2 (permalink)  
Старый 16.01.2019, 14:08
Интересующийся
Отправить личное сообщение для kotelok Посмотреть профиль Найти все сообщения от kotelok
 
Регистрация: 27.08.2018
Сообщений: 19

Получился следующий вариант - экспорт нэймспейса, внутри нэймспейса экспорт тех классов, что требуются снаружи и приватное описание тех классов, что нужны только для локального использования.

Например:
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();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из двух классо сформировать имя класса следующего блока imedia Элементы интерфейса 1 11.11.2017 18:41
Имя файла не соответствует имени класса - итог приложение не запускается, ошибок нет khusamov ExtJS 15 29.05.2015 15:58
Получение имя класса по id Гугл-мен Элементы интерфейса 1 20.10.2013 16:02
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 15:17
Как я могу вернуть имя класса Tini2n jQuery 8 27.05.2012 23:51