首页 > 解决方案 > 传递泛型类类型/构造函数而不是实例作为参数

问题描述

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

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>>,但这会迫使您T通过做来关闭baz<T>(...),而我希望它保持打开状态;你会得到像“不能Foo用类型参数构造非多态[1]”这样的错误。你在哪里new fooFactory<...>()

所以另一个明显的选择是 using Class<Foo>,但是你会得到错误“Cannot use Foo[1] without 1 type argument”。在那个参数上。

事实上,如果它有一个泛型类型说明符,它看起来不可能传递一个类的类型。那正确吗?如果是这样,那就太令人失望了。

标签: flowtype

解决方案


因此,您只需要以与调用工厂函数相同的方式来描述类型:

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>.


推荐阅读