Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Создание экземпляра generic переменной внутри generic класс (https://javascript.ru/forum/angular/78958-sozdanie-ehkzemplyara-generic-peremennojj-vnutri-generic-klass.html)

shtangen 28.11.2019 12:46

Создание экземпляра generic переменной внутри generic класс
 
Есть большое желание написать универсальный класс на основе generic.
Внутри класса я буду создавать generic-переменную. Например так:
export class EditComponents<T> {
	componentData: T = new T();
}

Порывшись в интернетах нашел следующий пример:
class ObjectCreator{
    static createEntity<TEntity>(type:{new():TEntity;}):TEntity{
        return new type();
    }
}


И реализация:
export class EditComponents<T> {
	componentData: T = ObjectCreator.createEntity<T>(T); 
}


Получаем ошибку: 'T' only refers to a type, but is being used as a value here.
Есть ли вариант как решить эту проблему? Спасибо.

Aetae 28.11.2019 22:20

Типы - это описание, конкретные функции требуют конкретных сущностней.
Что-то типа:
export class EditComponents<T> {
    constructor(DataClass: Type<T>) {
        this.componentData = new DataClass();
    }

    componentData!: T;
}

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

shtangen 29.11.2019 15:08

Спасибо, помогло.
Есть вопрос, касательно синтаксиса: componentData!: T; Для чего восклицательный знак?

Aetae 30.11.2019 01:45

https://www.typescriptlang.org/docs/...rtion-operator
В общем ничего особенного. Если у вас ts не ругается без !, значит либо он стал умнее, либо у вас отключена проверка на это дело.)

shtangen 03.12.2019 16:24

Спасибо за ответ, познавательно :thanks:

SuperZen 03.12.2019 18:40

Aetae, есть какая-нибудь жирная книжка или туториал, которые человеческим языком это объясняет, про вот этот <T>, чтобы нубу стало понятно?

Aetae 03.12.2019 21:06

SuperZen, наверняка есть.)
"Не-нубу" всё и так довольно очевидно, за исключением иногда вылезающих внезапных багов самого ts.)
Я лично никуда кроме доки на оффсайте не смотрел, так что помочь не могу.


Часовой пояс GMT +3, время: 10:23.