Typescript中的通用工厂参数

时间:2017-03-15 08:09:48

标签: generics typescript

这是通用工厂的官方Typescript文档中的示例。在此示例中,构造函数不接受参数。

function create<T>(c: {new(): T; }): T {
  return new c();
}

我怎么能重写这个以便除了类型之外,工厂方法接受其他参数并在调用它实例化的类的构造函数时传递它们?所以return语句看起来像这样:

return c(p1, p2);

我不清楚的是这个

{new(): T; }

实际上是一个接口,因为它定义了对提议类的兼容性的评估条款,顺便提一下也声明了构造函数签名。我要回答我自己的问题。

2 个答案:

答案 0 :(得分:1)

这就是我要做的事情:

module Factory {
    export function createInstance<T extends Wibble, K extends IRaw1>(ctor: { new (raw: K): T }, data: K): T {
        return new ctor(data);
    }
}
var raw1 = { Foo: "foo" } as IRaw1;
var d1 = Factory.createInstance(Wibble, raw1);

var raw2 = { Foo: "foo", Bar: "bar" } as IRaw2;
var d2 = Factory.createInstance(Wobble, raw2);

如果构造函数需要更多参数,那么只需将它们添加到您传递给ctor的一个对象中,这样您就不需要为每个参数添加更多通用约束。

答案 1 :(得分:0)

您无法定义可以将任意数量的参数传递给任意类的构造函数的单个工厂方法。

但是,您可以为任何特定数量的构造函数参数定义工厂方法。 Here's a rather elaborate sample in the Typescript playground。 它定义了类和接口以及派生类和接口,然后使用它们来演示工厂方法的工作原理。

该示例的第38行可能是整个节目中最有趣和令人印象深刻的部分:指定了一个不兼容的参数,这是由编辑器静态检测的!暗示第38行已经通过了检查,这符合期望; Wobble是Wibble的衍生物,因此可以接受,参数声明为IRaw2,它是IRaw1声明的参数类型的衍生物,因此也是可以接受的。

如果你想要一个双参数构造函数,它将如下所示:

c