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

时间:2019-01-28 14:55:57

标签: typescript

我正在研究Typescript的加载程序类,该类是根据字符串地址从外部库中加载的。

示例:'namespace/subnamespace/module''namespace/module'

我希望我的加载器类为每个请求的模块返回一个接口,以便在使用加载器类的地方自动进行正确的键入。

示例:

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) { }

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

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

这有可能吗?

任何帮助或想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

这并不是您真正需要的,但是您可以使用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'