#typescript #types #constructor #casting #extends
#typescript #типы #конструктор #Кастинг #расширяет
Вопрос:
Мне нужно создать HOF (функцию более высокого порядка), которая изменит / добавит свойство к прототипу предоставленного класса. Возможно ли это вообще?
interface IStore {
new (): {};
}
interface IWatchable {
new() : {
watch: boolean;
};
}
const Store = <T extends IStore>(clazz: T): T amp; IWatchable => {
return class extends clazz {
watch = true;
};
};
class X extends Store(class {})
// ^^^^^^^^^^^^^^
// Base constructors must all have the same return type.
Ответ №1:
Если вы хотите сделать микширование, это шаблон, который будет работать (согласно этому PR):
interface IStore {
new(...a: any[]): {};
}
const Store = <T extends IStore>(clazz: T) => {
return class extends clazz {
watch = true;
};
};
class X extends Store(class { }) { }
Это должно дать вам то, что вы хотите, у вас может быть IWatchable
интерфейс, и смешанные классы будут назначаться ему, даже если возвращаемая Store
функция явно не реализует интерфейс (чудо структурной типизации)
interface IWatchable {
new(): {
watch: boolean;
};
}
let w : IWatchable = X //ok