Javascript 将构造函数签名传播到工厂方法

Javascript 将构造函数签名传播到工厂方法,javascript,generics,typescript,Javascript,Generics,Typescript,我试图确定一种创建工厂函数的方法,这样我就可以向工厂函数传递一个类,并接收一个将创建该类实例的函数。类似于: function createClassFactory<T> (MyClass: {new(...):T}) { return function classFactory(...) { return new MyClass(...) } } 函数createClassFactory(MyClass:{new(…):T}){ 返回函数类工厂(…

我试图确定一种创建工厂函数的方法,这样我就可以向工厂函数传递一个类,并接收一个将创建该类实例的函数。类似于:

function createClassFactory<T> (MyClass: {new(...):T}) {
    return function classFactory(...) {
        return new MyClass(...)
    }
}
函数createClassFactory(MyClass:{new(…):T}){
返回函数类工厂(…){
返回新的MyClass(…)
}
}
为了维护类型信息,我希望
classFactory
具有与
MyClass
构造函数相同的签名。现在我对这怎么可能是个空白


这种类型的事情还有其他可能吗?

我想不出一种方法来做你想做的事情(至少不优雅),除非你愿意接受所有构造函数参数作为一个对象。
如果所有类都希望有一个对象作为参数,那么您可以在这些props对象上强制一个接口,并使用泛型实现您想要的(好吧,几乎是):

类基{
构造函数(props:T){}
}
类型BaseConstructor={
新(道具:P):C;
}
接口AProps{}
A类(基本类)

我这么说几乎是因为上一个例子,
a2
是用非空对象创建的。
但除此之外,我认为这正是你想要的。

谢谢你的回答!!:)--不过,我希望避免这种情况:/如果对可变类型实施此操作,我将能够做到这一点:)
class Base<T> {
    constructor(props: T) {}
}

type BaseConstructor<C extends Base<P>, P> = {
    new(props: P): C; 
}

interface AProps {}

class A extends Base<AProps> {}

interface BProps {
    x: number;
    y: number;
}

class B extends Base<BProps> {}

interface CProps {
    str: string;
    ok?: boolean;
}

class C extends Base<CProps> {}

function createClassFactory<C extends Base<P>, P> (MyClass: BaseConstructor<C, P>) {
    return function classFactory(props: P) {
        return new MyClass(props);
    }
}

// the following are valid:
let a1 = createClassFactory(A)({});
let b1 = createClassFactory(B)({ x: 3, y: 5 });
let c1 = createClassFactory(C)({ str: "stirng" });
let c2 = createClassFactory(C)({ str: "stirng", ok: true });

// these aren't:
let b2 = createClassFactory(B)({ x: 3, y: "5" });
let c3 = createClassFactory(C)({ ok: true });

// but this one is:
let a2 = createClassFactory(A)({ key: "value" });