如何在 Typescript 中将两个 classes 作为基础 class 相交以扩展 class

How to intersect two classes as base class for extended class in Typescript

我需要创建 HOF(高阶函数),它将 modify/add 属性 提供给 class 的原型。有可能吗?

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.

如果你想做混合,这是可行的模式(根据 this 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 接口,即使 [=13= 的 return ,mixin 类 也可以分配给它] 函数没有显式实现接口(结构类型的奇迹)

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