用于类引用的打字稿导出类型

时间:2019-01-02 14:49:47

标签: typescript

我正在尝试定义一个接口,其他团队成员在定义代码模块时可以遵循该接口,以便某些消耗代码的代码可以对某个模块进行假设,而任何新模块仅需要遵循该接口(更多或更少)以添加到系统中。

例如,假设我有一个目录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包含依赖于模块导出内容的不同类(但它将始终是类构造函数)。

能否实现我的追求?

1 个答案:

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