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

标签 typescript dependency-injection typescript-typings

我正在尝试找到一种方法将一个对象注入(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/

相关文章:

angular - 如何在 Angular 中使用 recaptcha v3?

javascript - 将三个数组合并成一个字符串

javascript - 类型错误 : The 'compilation' argument must be an instance of Compilation

wcf - 服务契约(Contract) WCF 中的 DI

javascript - Angular2 中没有服务提供者错误,为什么我需要将其注入(inject)到它的父组件中?

javascript - 如何让 TypeScript 提示字符串与其他类型的连接?

typescript - 从对象中提取 typescript 签名到接口(interface)中

c# - 应该如何使一个具有依赖项的类可以在不膨胀的情况下进行单元测试?

javascript - typescript 2 : Custom Type definition in node_modules

node.js - 在编写自定义 TypeScript 定义文件时出现错误 "Module ' name'resolves to an untyped module at..."