Создание экземпляра 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. Есть ли вариант как решить эту проблему? Спасибо. |
Типы - это описание, конкретные функции требуют конкретных сущностней.
Что-то типа: export class EditComponents<T> { constructor(DataClass: Type<T>) { this.componentData = new DataClass(); } componentData!: T; } При этом генерик явно при создании объекта EditComponents указывать уже не надо, ts достаточно умный чтобы понять на основе переданных данных. |
Спасибо, помогло.
Есть вопрос, касательно синтаксиса: componentData!: T; Для чего восклицательный знак? |
https://www.typescriptlang.org/docs/...rtion-operator
В общем ничего особенного. Если у вас ts не ругается без !, значит либо он стал умнее, либо у вас отключена проверка на это дело.) |
Спасибо за ответ, познавательно :thanks:
|
Aetae, есть какая-нибудь жирная книжка или туториал, которые человеческим языком это объясняет, про вот этот <T>, чтобы нубу стало понятно?
|
SuperZen, наверняка есть.)
"Не-нубу" всё и так довольно очевидно, за исключением иногда вылезающих внезапных багов самого ts.) Я лично никуда кроме доки на оффсайте не смотрел, так что помочь не могу. |
Часовой пояс GMT +3, время: 09:14. |