2015-10-06 84 views
2

我正在尝试为我使用的库编写TypeScript定义。它有一个插件系统,除了插件以外,我无法控制它,必须扩展Plugin。所述PluginManager具有如下功能:参数是一个类的声明函数,返回该类的一个实例?

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

哪里参数插件是一类(Apple.Tree),并返回一个instanceof 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扩展了插件,它正在抱怨那里有一些东西。我有一种感觉,它可能与这个通用函数有关。

我将不胜感激任何意见。

+0

其实,我只注意到插件有一个构造'(游戏:任何,父母?:任何)'。这可能是缺少的参考。但是,这为我的问题增添了一层复杂性。也许不会,因为'PluginManager'有它自己的'game'实例。而'parent'是'PluginManager'。所以这个函数不应该关心提供对这些参数的访问。 – user1059939

回答

4

昨晚我刚刚在类似的问题上工作。这里有一个例子,你可以适用于您的情况:

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

+0

我只想说感谢大卫,这完全符合我的所有测试。我曾经避开像核区一样的插件! – user1059939

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如果您向下滚动到标题为“使用类类型的泛型”部分

+0

谢谢你的帮助Spike!其中一个时刻,这是混搭,你很好地梳理候选人的答案,就像你不应该成为的法官! – user1059939

相关问题