我正在尝试定义一个接口,其他团队成员在定义代码模块时可以遵循该接口,以便某些消耗代码的代码可以对某个模块进行假设,而任何新模块仅需要遵循该接口(更多或更少)以添加到系统中。
例如,假设我有一个目录Foo
,该目录从其index.ts
中导出以下内容:
import * as propertyC from './propertyC'
export const foo:IModule = {
propertyA: value,
propertyB: value,
propertyC
}
上面的 propertyC
导入1个或更多类。我希望能够将propertyC定义为对构造函数(而不是实例)的引用,并希望IDE知道这些类是什么,以简化生活。我可以将IModule
定义为:
interface IModule {
propertyA: MyTypeA;
propertyB: MyTypeB;
propertyC: {
[source:string]: typeof MyClass
};
}
但是,当我想调用new foo.propertyC.MyClass()
时,foo.propertyC
不知道propertyC
上存在哪些类。在我的测试中,这似乎是我定义的索引签名的一个缺点(这很有意义)。我也玩过泛型,并尝试将某种类型传递给IModule
,但没有任何运气。
我想让任何消耗代码知道propertyC
上存在什么类,同时也允许propertyC
包含依赖于模块导出内容的不同类(但它将始终是类构造函数)。
能否实现我的追求?
答案 0 :(得分:1)
如果我正确理解,可以通过在typeof
导入中使用propertyC
来完成这项工作。
import * as propertyC from "./propertyC"
interface IModule {
propertyA: MyTypeA;
propertyB: MyTypeB;
propertyC: typeof propertyC;
}
function test(foo: IModule) {
new foo.propertyC.MyClass("me")
}
以供参考:
// propertyC.ts
export class MyClass { constructor(public name: string) {} }