参数是一个类的声明函数,返回该类的一个实例?
我正在尝试为我使用的库编写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扩展了插件,它正在抱怨那里有一些东西。我有一种感觉,它可能与这个通用函数有关。
我将不胜感激任何意见。
昨晚我刚刚在类似的问题上工作。这里有一个例子,你可以适用于您的情况:
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
我只想说感谢大卫,这完全符合我的所有测试。我曾经避开像核区一样的插件! – user1059939
您可以指定参数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如果您向下滚动到标题为“使用类类型的泛型”部分
谢谢你的帮助Spike!其中一个时刻,这是混搭,你很好地梳理候选人的答案,就像你不应该成为的法官! – user1059939
其实,我只注意到插件有一个构造'(游戏:任何,父母?:任何)'。这可能是缺少的参考。但是,这为我的问题增添了一层复杂性。也许不会,因为'PluginManager'有它自己的'game'实例。而'parent'是'PluginManager'。所以这个函数不应该关心提供对这些参数的访问。 – user1059939