声明参数是一个类的函数,返回该类的实例?

时间:2015-10-06 13:53:30

标签: typescript

我正在尝试为我使用的库编写TypeScript定义。它有一个插件系统,除了插件必须扩展Plugin之外我无法控制。 PluginManager有一个功能

add(plugin: any, ...parameters: any[]): any;

其中参数插件是Class(Apple.Tree)并返回Apple.Tree的实例。 Apple.Tree扩展插件。

有没有办法让它成为通用函数并保持类型?

我试过了:

add<T extends Plugin>(plugin: T, ...parameters: any[]): T;

当我尝试将其称为此功能时,它说。 Argument of type "typeof Apple.Tree" is not assignable to parameter of type "Plugin"

它说Apple.Tree中缺少一处房产。然而,由于Apple.Tree扩展了插件,它正在抱怨有些东西存在。我觉得这可能与这个通用功能有关。

我很感激任何建议。

2 个答案:

答案 0 :(得分:5)

我昨晚刚刚处理过类似的问题。以下是您可以应用于您的情况的示例:

class Tree extends Plugin {

}

interface ConstructorOf<T> {
    new(...args: any[]): T; // allow for constructors with any amount of parameters
}

function add<T extends Plugin>(plugin: ConstructorOf<T>, ...parameters: any[]) {
    // create a new instance of plugin and pass in the parameters
    return new plugin(...parameters);
}

var tree = add(Tree); // tree is typed as Tree and not typeof Tree

Source

答案 1 :(得分:4)

您可以指定参数plugin是具有此类型约束的类构造函数:

class PlugIn {
}

class TestPlugIn extends PlugIn {
}

class PluginManager {
  add<T extends PlugIn>(plugin: {new(): T; }, ...parameters: any[]): T {
      return new plugin();
  }
}

var manager = new PluginManager();
var plugin = manager.add(TestPlugIn);

我在这里没有做的唯一事情是将传递的parameters应用于构造函数。

此处记录{new(): T; }语法:TypeScript Handbook: Generics如果向下滚动到标题为“在泛型中使用类类型”的部分