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
