将现有名称空间导出为另一个

时间:2018-02-14 21:20:05

标签: typescript

假设我有一个声明具有某些属性的命名空间的模块。例如:

declare module "database" {
  export namespace Database {
    namespace statics {
      type static1 = any;
      type static2 = any;
    }
  }
  const database: Database;
  export default database;
}

我可以使用import { Database } from "database",然后使用Database.statics.static作为类型。

我想创建另一个模块,允许您直接导入静态。例如:declare module "database/statics"

我想避免重写所有的类型定义,因为可能比我的例子更多。我试过移出模块定义,但后来我不确定如何做以下的事情:

declare namespace Database { ... }
declare module "database/statics" {
  export = Database.statics;
}

上面给了我Property 'statics' does not exist on type 'Database'

我想我的问题的总和本质上是:有没有办法从另一个模块中声明的模块中导出命名空间?

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,答案是使用triple slash reference directive告诉打字稿从另一个文件/模块导入定义:

database.d.ts:

declare module "database" {
    export namespace Database {
        namespace Statics {
            export type static1 = any;
            export type static2 = any;
        }
    }
}

database-static.d.ts:

///<reference path="database.d.ts"/>

declare module "database-statics" {
    import {Database} from "database";
    import Statics = Database.Statics;

    export = Statics;
}

以上示例适用于同一目录中的这两个.d.ts文件。如果将它们分成单独的模块,则应使用///<reference types="database"/>

要注意的一件事是,这将使两个模块相互依赖,因此通过从第二个模块导出定义,您实际上并没有完成太多工作。

import * as Statics from "database-statics";

没有什么不同
import {Database} from "database";
import Statics = Database.Statics;

以及包含两个.d.ts文件的两个模块在第一种情况下都需要存在