我正在尝试为我使用的库编写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扩展了插件,它正在抱怨有些东西存在。我觉得这可能与这个通用功能有关。
我很感激任何建议。
答案 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
答案 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如果向下滚动到标题为“在泛型中使用类类型”的部分