gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:13 25 4
gpt4 key购买 nike

我正在尝试确定一种创建通用工厂函数的方法,这样我就可以将一个类传递给它并接收回一个将创建该类实例的函数。类似于:

function createClassFactory<T> (MyClass: {new(...):T}) {
return function classFactory(...) {
return new MyClass(...)
}
}

为了维护类型信息,我希望 classFactory 具有与 MyClass 构造函数相同的签名。现在,我对这怎么可能是一片空白。

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

最佳答案

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

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" });

( code in playground )

我说几乎是因为最后一个例子,其中 a2 是用一个非空对象创建的。
但除此之外,我认为这几乎就是您所要求的。

关于javascript - 将构造函数签名传播到工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39184430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com