typer - Hur man korsar två klasser som basklass för en utökad klass i Typescript


Jag behöver skapa en HOF (Higher order function) som kommer att modifiera/lägga till en egenskap på prototypen av den angivna klassen. Är det ens möjligt?

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.

Svar #1

Om du vill göra mixins är detta mönstret som kommer att fungera (enligt denna PR):

interface IStore {
    new(...a: any[]): {}; 
}

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

class X extends Store(class { }) { }

Detta bör ge dig det du vill ha, du kan ha IWatchable-gränssnittet, och mixin-klasserna kommer att kunna tilldelas det även om returvärdet av Store-funktionen inte uttryckligen implementerar gränssnittet (miraklet med strukturell typning)

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