typescript - конструктор класса прозрачной оболочки с сохранением сигнатуры типа - PullRequest
0 голосов
/ 05 августа 2020

Я хочу обернуть конструктор BaseClass из библиотеки, которую я не могу изменить, чтобы добавить префикс к полю name, переданному конструктору.

I ' Я бы хотел, чтобы моя обертка была максимально c типов. Единственное, что ему действительно нужно знать, это то, что первый аргумент, переданный конструктору, содержит свойство string name. SubClass должен иметь ту же сигнатуру типа, что и BaseClass.

Следующий код не совсем работает

Линтер жалуется, что config переданный в super имеет тип Param0<string> не Param0<T>, но ему не нравится, когда я использую ConstructorParameters<typeof BaseClass<T>>[0] (т.е. с дополнительным <T>).

type Param0<T extends string> = { name: string, t_val: T };

class BaseClass<T extends string>{
  constructor(config: Param0<T>) {
    // ...
  }
  // ...
}

class SubClass<T extends string> extends BaseClass<T> {
  constructor(config: ConstructorParameters<typeof BaseClass>[0]) {
    config.name = "special_prefix_" + config.name;
    super(config);
  }
}

Бонус

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

class SubClass<...Generics extends GenericsOf<BaseClass>>
      extends BaseClass<...Generics>

1 Ответ

0 голосов
/ 05 августа 2020

Самое простое решение - отказаться от использования ConstructorParameters и скопировать-вставить подпись конструктора.

class SubClass<T extends string> extends BaseClass<T> {
  constructor(config: Param0<T>) {
    config.name = "special_prefix_" + config.name;
    super(config);
  }
}

Потому что, если вы сделаете это:

config: ConstructorParameters<typeof BaseClass>[0]

BaseClass еще не насыщен T, поэтому TypeScript не знает, каким должен быть T. Он не позволит вам заменить что-либо как T, так как он не может сказать, что такое T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...