Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript通用工厂函数,包括已创建对象的参数_Typescript_Typescript Generics - Fatal编程技术网

Typescript通用工厂函数,包括已创建对象的参数

Typescript通用工厂函数,包括已创建对象的参数,typescript,typescript-generics,Typescript,Typescript Generics,我正在尝试用Typescript创建一个工厂类。工厂应设置为创建特定的对象类,包括在工厂初始化时设置的默认参数 以下是我到目前为止的想法: type构造函数=new(…参数:any)=>T; 阶级工厂{ 私有参数:构造函数参数; 私人建造商:建造商; 初始化(t构造函数:TCtor, …参数:构造函数参数) { this.ctor=t构造函数; this.params=params; } create():T{ 返回新的this.ctor(…this.params); } } 类ClassWit

我正在尝试用Typescript创建一个工厂类。工厂应设置为创建特定的对象类,包括在工厂初始化时设置的默认参数

以下是我到目前为止的想法:

type构造函数=new(…参数:any)=>T;
阶级工厂{
私有参数:构造函数参数;
私人建造商:建造商;
初始化(t构造函数:TCtor,
…参数:构造函数参数)
{
this.ctor=t构造函数;
this.params=params;
}
create():T{
返回新的this.ctor(…this.params);
}
}
类ClassWithParams{constructor(a:number){}
const factory=新工厂();
//factory.init(ClassWithParams);
//编译错误-缺少参数a
init(ClassWithParams,1);
console.log(factory.create());
//ClassWithParams的实例
上面的代码运行良好()。但是,它需要在构建之后直接调用工厂的
init()。我无法将
init()
代码移动到构造函数中,因为
init()
依赖于一个通用参数
TCtor
,以便正确地键入检查参数列表

我可以将
TCtor
改为类的泛型参数,但这意味着每次泛型引用Factory时,都需要无理由地提供一个额外的类型参数


有没有办法删除
init()
调用?

下面的代码有什么问题

type Constructor<T> = new (...args: any[]) => T;

class Factory<T, C extends Constructor<T> = Constructor<T>> {
    params: ConstructorParameters<C>;
    ctor: Constructor<T>;
    constructor(tConstructor: Constructor<T>,
        ...params: ConstructorParameters<C>) {
        this.ctor = tConstructor;
        this.params = params;
    }

    create(): T {
        return new (this.ctor)(...this.params)
    }
}
class ClassWithParams { constructor(a: number) { this.a = a; } a: number } 

const factory1 = new Factory(ClassWithParams);

const factory2 = new Factory(ClassWithParams, '1');

const factory3 = new Factory(ClassWithParams, 0);


const value = new Factory(ClassWithParams, 0).create().a;
type构造函数=new(…args:any[])=>T;
阶级工厂{
参数:构造函数参数;
建造师;
构造函数(t构造函数:构造函数,
…参数:构造函数参数){
this.ctor=t构造函数;
this.params=params;
}
create():T{
返回新的(this.ctor)(…this.params)
}
}
类ClassWithParams{constructor(a:number){this.a=a;}a:number}
const factory1=新工厂(ClassWithParams);
const factory2=新工厂(ClassWithParams,'1');
const factory3=新工厂(ClassWithParams,0);
常量值=新工厂(ClassWithParams,0).create().a;

如图所示,它既方便又正确。

我意识到我的答案中有一个错误,导致类型信息丢失。请查看更新的版本哦,很有趣,它似乎对我有用-丢失了什么类型的信息?Factory.prototype.create的返回类型是错误的。试试新的version@AluanHaddad新实现不正确-不正确参数没有类型错误。你是说
t构造函数:C
而不是
t构造函数:构造函数