Generics Typescript中的通用工厂参数

Generics Typescript中的通用工厂参数,generics,typescript,Generics,Typescript,这是通用工厂的正式Typescript文档中的示例。在此示例中,构造函数不接受参数 function create<T>(c: {new(): T; }): T { return new c(); } 我不清楚的是 {new(): T; } 实际上是一个接口,因为它定义了建议类的兼容性评估条款,顺便说一句,它还声明了构造函数签名。我将回答我自己的问题。不能定义一个工厂方法,它可以将任意数量的参数传递给任意类的构造函数 但是,您可以为任何特定数量的构造函数参数定义工厂方法。 它

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

function create<T>(c: {new(): T; }): T {
  return new c();
}
我不清楚的是

{new(): T; }

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

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

但是,您可以为任何特定数量的构造函数参数定义工厂方法。 它定义类和接口以及派生类和接口,然后使用它们来演示工厂方法的工作原理

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

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

return c(p1, p2);
export function createInstance<T1, T2, T3>(ctor: new(p: T1, q: T2) => T3, p:T1, q:T2): T3 {
  return new ctor(p, q);
}
导出函数createInstance(ctor:new(p:T1,q:T2)=>T3,p:T1,q:T2):T3{ 返回新的ctor(p,q); }
您不能定义一个工厂方法,该方法可以将任意数量的参数传递给任意类的构造函数

但是,您可以为任何特定数量的构造函数参数定义工厂方法。 它定义类和接口以及派生类和接口,然后使用它们来演示工厂方法的工作原理

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

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

return c(p1, p2);
export function createInstance<T1, T2, T3>(ctor: new(p: T1, q: T2) => T3, p:T1, q:T2): T3 {
  return new ctor(p, q);
}
导出函数createInstance(ctor:new(p:T1,q:T2)=>T3,p:T1,q:T2):T3{ 返回新的ctor(p,q); }
这就是我要做的:

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);
模块工厂{
导出函数createInstance(ctor:{new(raw:K):T},数据:K):T{
返回新的ctor(数据);
}
}
var raw1={Foo:“Foo”}作为IRaw1;
var d1=Factory.createInstance(Wibble,raw1);
var raw2={Foo:“Foo”,Bar:“Bar”}as IRaw2;
var d2=Factory.createInstance(摆动,raw2);

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

这就是我要做的:

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);
模块工厂{
导出函数createInstance(ctor:{new(raw:K):T},数据:K):T{
返回新的ctor(数据);
}
}
var raw1={Foo:“Foo”}作为IRaw1;
var d1=Factory.createInstance(Wibble,raw1);
var raw2={Foo:“Foo”,Bar:“Bar”}as IRaw2;
var d2=Factory.createInstance(摆动,raw2);

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

您需要向
create
函数传递一个类,然后该类将被实例化。什么是
p1
p2
?p1和p2是factory方法的任意附加参数,在调用时将传递给构造函数。函数是泛型的,是否总是使用具有需要两个参数的构造函数的类来调用它?这些论点的类型是什么?@NitzanTomer我刚刚了解了
{new():T;}
部分的意思,现在我认为我自己的问题太宽泛了。我将关闭它并继续研究。感谢您的尝试。您可以尝试在问题中更好地解释您的问题,也许可以给出一个您想要的示例,可以是伪代码。您需要将
创建
函数传递给一个类,然后该类将被实例化。什么是
p1
p2
?p1和p2是factory方法的任意附加参数,在调用时将传递给构造函数。函数是泛型的,是否总是使用具有需要两个参数的构造函数的类来调用它?这些论点的类型是什么?@NitzanTomer我刚刚了解了
{new():T;}
部分的意思,现在我认为我自己的问题太宽泛了。我将关闭它并继续研究。谢谢你的尝试。你可以试着在你的问题中更好地解释你的问题,也许可以举一个你想要的例子,可以是伪代码。我今天早上醒来时有着完全相同的想法(这里是0747),尽管我还没有想到用扩展来约束。我今天早上有着完全相同的想法(这里是0747)当我醒来时,虽然我还没有意识到用扩展来约束自己。