Javascript.RU

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

Создание экземпляра 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.
Есть ли вариант как решить эту проблему? Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 28.11.2019, 22:20
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

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

    componentData!: T;
}

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

Последний раз редактировалось Aetae, 28.11.2019 в 22:28.
Ответить с цитированием
  #3 (permalink)  
Старый 29.11.2019, 15:08
Интересующийся
Отправить личное сообщение для shtangen Посмотреть профиль Найти все сообщения от shtangen
 
Регистрация: 21.08.2019
Сообщений: 11

Спасибо, помогло.
Есть вопрос, касательно синтаксиса: componentData!: T; Для чего восклицательный знак?
Ответить с цитированием
  #4 (permalink)  
Старый 30.11.2019, 01:45
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

https://www.typescriptlang.org/docs/...rtion-operator
В общем ничего особенного. Если у вас ts не ругается без !, значит либо он стал умнее, либо у вас отключена проверка на это дело.)
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 03.12.2019, 16:24
Интересующийся
Отправить личное сообщение для shtangen Посмотреть профиль Найти все сообщения от shtangen
 
Регистрация: 21.08.2019
Сообщений: 11

Спасибо за ответ, познавательно
Ответить с цитированием
  #6 (permalink)  
Старый 03.12.2019, 18:40
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

Aetae, есть какая-нибудь жирная книжка или туториал, которые человеческим языком это объясняет, про вот этот <T>, чтобы нубу стало понятно?
Ответить с цитированием
  #7 (permalink)  
Старый 03.12.2019, 21:06
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение значения переменной внутри обработчика события jQuery Mbenga Общие вопросы Javascript 2 01.07.2013 10:57
Создание переменной по значению другой переменной bahek2462774 Общие вопросы Javascript 2 09.10.2011 10:11
изменение значения глобальной переменной внутри функции mgmarket Серверные языки и технологии 14 13.09.2011 00:56
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00