gpt4 book ai didi

typescript :如何在依赖项中返回正确的类和泛型类型

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

我正在尝试找到一种方法将一个对象注入(inject)另一个对象(依赖注入(inject)),其中容器对象可以返回正确注入(inject)的对象类型,并且无需显式将类型传递给函数(类型推断)。
为确保注入(inject)的对象具有通用接口(interface)和默认行为,它们将是抽象类的实例。

鉴于我在某个时间点需要这样的行为,我想避免使用依赖注入(inject)框架来这样做。

It seems to me that what I need is to set the generic type on object instantiation because generic parameters cannot be redefined afterwards. Consequently I'd need to use a factory (new() interface)


这是一个例子。 Test it in Typescript Playground .为简单起见,我正在寻找 createMyClass2返回类型为 ArrayClass<string> 的对象,在调用它时没有明确指定类型(类型推断)。
可以认为 ArrayClassArrayClassAbstract例如,在不同的 NPM 模块中定义的某种插件。

class ArrayClassAbstract<MYTYPE> {
public arr: Array<MYTYPE> = []
constructor(element: MYTYPE) {
this.arr.push(element);
}
}

class ArrayClass<MYTYPE> extends ArrayClassAbstract<MYTYPE> {
test() {
return this.arr;
}
}

class SomeOtherArrayClass<MYTYPE> extends ArrayClassAbstract<MYTYPE> {
test() {
return this.arr + "something different";
}
}

function createMyClass<MYTYPE>
(className: { new <MYTYPE>(element: MYTYPE): ArrayClassAbstract<MYTYPE> }, element: MYTYPE) {
return new className<MYTYPE>(element);
}

let a = createMyClass(ArrayClass, "hop!"); // type: {ArrayClassAbstract<string>}
a.test(); // Doesn't work... "test" doesn't exist in ArrayClassAbstract

好的泛型类型,错误的类类型...

function createMyClass2<T extends ArrayClassAbstract<string>>
(className: { new (element: string): T }, element: string) {
return new className(element);
}

let b = createMyClass2(ArrayClass, "hop!"); // type: {ArrayClass<any>}
b.test(); // Works but array elements typed as "any"

好的类类型,错误的泛型类型。我不知道我声明工厂的方式是否有问题,或者我是否是 Typescript 限制的受害者......

有什么想法吗?

最佳答案

使用重载怎么样?

function createMyClass2<MYTYPE>(type: typeof ArrayClass, element: MYTYPE): ArrayClass<MYTYPE>;
function createMyClass2<MYTYPE>(type: typeof SomeOtherArrayClass, element: MYTYPE): SomeOtherArrayClass<MYTYPE>;
function createMyClass2(className, element) {
return new className(element);
}

let b = createMyClass2(ArrayClass, "hop!"); // type: {ArrayClass<string>}
b.test();
let c = createMyClass2(ArrayClass, 123); // type: {ArrayClass<number>}
c.test();
let d = createMyClass2(SomeOtherArrayClass, "hop!"); // type: {SomeOtherArrayClass<string>}
d.test();

关于 typescript :如何在依赖项中返回正确的类和泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43688748/

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