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

时间:2018-11-11 07:58:28

标签: flowtype

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

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

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

实际上,如果它具有泛型类型说明符,似乎无法传递类的类型。那正确吗?如果是这样,那就太令人失望了。

1 个答案:

答案 0 :(得分:0)

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

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>