Я хочу обернуть конструктор 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>