代码之家  ›  专栏  ›  技术社区  ›  Alex

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

  •  0
  • Alex  · 技术社区  · 6 年前

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

    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>(...) ,但我希望它保持打开状态;您将得到如下错误:“Cannot construct non-polymorphic” Foo [1] 带类型参数 new fooFactory<...>()

    所以另一个明显的选择是 Class<Foo> ,但您会得到错误“无法使用 [1] 没有一个类型参数。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ivan Gabriele    6 年前

    所以你只需要用调用工厂函数的方式来描述输入:

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