Как пересечь два класса в качестве базового класса для расширенного класса в Typescript - PullRequest
1 голос
/ 25 марта 2019

Мне нужно создать HOF (функция высшего порядка), которая будет модифицировать / добавлять свойство к прототипу предоставленного класса. Это вообще возможно?

interface IStore {
  new (): {};
}

interface IWatchable {
  new() : {
    watch: boolean;
  };
}

const Store = <T extends IStore>(clazz: T): T & IWatchable => {
  return class extends clazz {
    watch = true;
  };
};

 class X extends Store(class {})
//              ^^^^^^^^^^^^^^ 
//              Base constructors must all have the same return type.

1 Ответ

0 голосов
/ 25 марта 2019

Если вы хотите сделать миксин, это шаблон, который будет работать (согласно этот 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, и классы mixin будут назначаться ему, даже если функция возврата Store не реализует интерфейс явно (чудо структурной типизации) )

interface IWatchable {
    new(): {
        watch: boolean;
    };
}
let w : IWatchable = X //ok
...