如何在Typescript

时间:2019-03-25 11:24:21

标签: typescript types constructor casting extends

我需要创建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 :(得分:0)

如果您要进行混合,则可以使用以下模式(根据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接口,并且即使Store函数的返回未显式实现该接口,mixin类也可以分配给它(结构类型化的奇迹)

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