lightalex
@lightalex

Реален ли такой дженерик в TypeScript?

Есть функция в которую я передаю класс:
function wrapper<T extends { start(...args: any[]): void }>(target: { new(...args: any[]): T }, ...args: any[]): T {
	let instance = new target();
	instance.start(...args);
	return instance;
}

Соответственно можно сделать так:
class RandomClass {
	start(arg1: string, arg2: number) { /* ... */ }
}
let instance = wrapper(RandomClass, 'Hello, world!', 777);

Но поскольку у меня прописано target: { new(...args: any[]): T }, ...args: any[], то редактор кода (например Visual Code) не понимает какие аргументы должны идти далее и мне как программисту надо самому думать какие параметры я должен передать. Можно ли как-то переписать дженерик, так чтобы после того как я прописываю первый аргумент target, то последующие аргументы брались из target.prototype.init?
То есть если вернуться к примеру выше, чтобы после ввода wrapper(RandomClass, редактор кода сообщил мне, что я должен ввести еще arg1: string, arg2: number.
Это вообще возможно? Или TypeScript еще не настолько гибок?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 2
Aetae
@Aetae Куратор тега TypeScript
Тлен
Вот так с указанием на аргументы:
function wrapper<T extends { start(...args: unknown[]): unknown }>(target: { new(): T }, ...args: Parameters<T['start']>): T {
  let instance = new target();
  instance.start(...args);
  return instance;
}


class RandomClass {
  start(arg1: string, arg2: number) { /* ... */ }
}
let instance = wrapper(RandomClass, 'Hello, world!', 777); /// все ок
let instance2 = wrapper(RandomClass, 777); /// ошибка
Ответ написан
Комментировать
Robur
@Robur
Знаю больше чем это необходимо
function wrapper<A extends any[], T extends { start(...args: A): void }>(target: { new(): T }, ...args: A): T {
  let instance = new target();
  instance.start(...args);
  return instance;
}


class RandomClass {
  start(arg1: string, arg2: number) { /* ... */ }
}
let instance = wrapper(RandomClass, 'Hello, world!', 777); /// все ок
let instance2 = wrapper(RandomClass, 777); /// ошибка


ошибка правда немного странная ругаться будет на RandomClass а не аргументы, возможно можно заставить ругаться на агрументы, не уверен.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы