将泛型类类型/构造函数而不是实例作为参数传递



假设我们有一个包含此类的文件:

class Foo<T> {
bar: T;
constructor(bar: T) {
this.bar = bar;
}
}
function getFooType() {
return Foo;
}

在另一个文件中,getFooType()的返回值传入:

function baz(fooType: ???) {
let foo1 = new fooType<number>(1);
let foo2 = new fooType<string>("2");
}

我一辈子都想不出???应该包含什么。

自然的选择是Class<Foo<T>>,但这迫使你通过执行baz<T>(...)来关闭T,而我希望它保持打开;在执行new fooFactory<...>()时,会出现类似"无法用类型参数构造非多态Foo[1]"的错误

因此,另一个明显的选择是使用Class<Foo>,但在该参数上会出现错误"如果没有1个类型参数,就无法使用Foo[1]"。

事实上,如果类具有泛型类型说明符,则似乎不可能传递该类的类型。是这样吗?如果是这样的话,那就太令人失望了。

所以你只需要像调用工厂函数一样描述打字:

function baz(fooType: <T>(bar: T) => Foo<T>) {
let foo1 = new fooType<number>(1);
let foo2 = new fooType<string>("2");
}

注意:

知道它使用依赖注入机制实际上非常重要,因为这解决了泛型声明的问题。然而,<T>意味着typeof T等于any。您应该指定更准确的内容,如<T: number | string>

最新更新