未实例化类的数组的Typescript数据类型

时间:2018-12-23 00:04:49

标签: typescript

我想在Typescript类中实现“特征”(如PHP)功能。我以为下面的代码可以工作,但不能。我不知道为什么对我来说有意义。

interface Trait {
    register: (Model: BaseModel, option?: object) => void
}

interface IPrototype {
    prototype: any;
}

class Tenable implements Trait {
    register(Entity: BaseModel & IPrototype, option = {}) {
        Entity.prototype.hello = function () {
            console.log('Hello World from Tenable!');
        }
    }
}

class BaseModel { 
  protected traits: Trait[] = [];
}

class A extends BaseModel {
  protected traits = [Tenable];
}

如果在Typescript Playgound中运行此代码,则会看到错误。 Typescript Playground

2 个答案:

答案 0 :(得分:1)

这意味着Trait个对象的数组。

protected traits: Trait[] = [];

但是在这里,您创建了一个带有Trait对象构造函数的数组。

protected traits = [Tenable];

要获取构造此类对象的构造函数的列表,您需要更改特征类型。

protected traits: (new () => Trait)[] = [];

答案 1 :(得分:1)

如果您想要一个Trait数组(类)

您可以将Trait从接口更改为抽象类

abstract class Trait {
  register: (Model: BaseModel, option?: object) => void;
}

然后使用typeof

class BaseModel {
  protected traits: Array<typeof Trait> = [];
}