【问题标题】:Generic factory parameters in TypescriptTypescript 中的通用工厂参数
【发布时间】:2017-08-05 20:42:16
【问题描述】:

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

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

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

return c(p1, p2);

我不清楚的是这个

{new(): T; }

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

【问题讨论】:

  • 您需要向create 函数传递一个类,然后将其实例化。 p1p2 是什么?
  • p1 和 p2 是工厂方法的任意附加参数,在调用它时将传递给构造函数。
  • 该函数是通用的,是否总是使用具有需要 2 个参数的构造函数的类来调用它?这些论点的类型是什么?
  • @NitzanTomer 我刚刚了解了{new(): T;} 部分的含义,现在我认为我自己的问题太宽泛了。我将关闭它并继续研究。感谢您的尝试。
  • 你可以尝试在你的问题中更好地解释你的问题,也许可以举一个你想要的例子,可以是伪代码

标签: generics typescript


【解决方案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 的一个对象中,这样您就不需要为每个参数添加更多通用约束。

【讨论】:

  • 我今天早上起床时也有同样的想法(这里是 0747),尽管我还没有想到使用扩展进行约束。
【解决方案2】:

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

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

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

如果你想要一个双参数构造函数,它看起来像这样:

export function createInstance<T1, T2, T3>(ctor: new(p: T1, q: T2) => T3, p:T1, q:T2): T3 {
  return new ctor(p, q);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 2021-02-07
    • 1970-01-01
    • 2011-05-08
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多