typescript – 基于字符串参数的通用返回值

我正在为Typescript加载一个基于字符串地址从外部库加载的加载器类.

示例:’namespace / subnamespace / module’或’namespace / module’

我希望我的loader类为每个请求的模块返回一个接口,以便在使用loader类时自动正确输入.

例:

export abstract class moduleLoader {
    public static load(...modules: string[]) {
        return externalLoader.loadModules(modules); // Promise<any[]>
    }
}
------------------------------
let [module1, module2] = await moduleLoader.load('namespace/subnamespace/module', 'namespace/module');
if (module1 instanceof iNamespace.iSubnamespace.iModule) { }

我无法弄清楚如何构造loader方法,以便从传入的字符串推断或映射接口,或者传入接口并从那里获取字符串以传递给外部加载器.

我知道我可以在load方法上设置泛型,以便给出适当的接口返回值,但我希望它是自动的,以便使用该方法的开发人员不需要自己弄清楚并消除运行时错误.这个代码库供外部开发者使用,所以我不想相信他们知道他们在做什么.

这甚至可能吗?

任何帮助或想法都表示赞赏.

最佳答案 这不完全是您所需要的,但您可以使用
function overloads一次提供一个库:

interface MyLib1 {
    str: string
}
interface MyLib2 {
    nb: number
}

function load(libName: "MyLib1"): Promise<MyLib1>
function load(libName: "MyLib2"): Promise<MyLib2>
function load(libName: string): Promise<any> {
    return /* */
}

然后,使用它:

let myLib1 = await load("MyLib1") // type is: 'MyLib1'
let myLib2 = await load("MyLib2") // type is: 'MyLib2'

或者,使用它同时加载几个库:

let [myLib1, myLib2] = await Promise.all([
    load("MyLib1"),
    load("MyLib2")
])
// 'myLib1' is of type 'MyLib1', and 'myLib2' is of type 'MyLib2'
点赞