我正在研究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方法上设置泛型,以为返回值提供适当的接口,但是我希望它是自动的,这样使用该方法的开发人员就不必自己弄清楚了,消除运行时错误。该代码库供外部开发人员使用,所以我不想相信他们知道他们在做什么。
这有可能吗?
任何帮助或想法都会受到赞赏。
答案 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'