Как пересечь два класса в качестве базового класса для расширенного класса в Typescript

#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