我正在尝试找到一种方法将一个对象注入(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>
的对象,在调用它时没有明确指定类型(类型推断)。
可以认为 ArrayClass
和 ArrayClassAbstract
例如,在不同的 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/