【问题标题】:Export existing namespace as another module将现有命名空间导出为另一个模块
【发布时间】:2018-07-25 13:41:59
【问题描述】:

假设我有一个模块,它声明了一个带有一些属性的命名空间。例如:

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'

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    database.d.ts:

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

    数据库静态.d.ts:

    ///<reference path="database.d.ts"/>
    
    declare module "database-statics" {
        import {Database} from "database";
        import Statics = Database.Statics;
    
        export = Statics;
    }
    

    上面的示例适用于同一目录中的这两个.d.ts 文件。如果将它们拆分为单独的模块,则可以改用 ///&lt;reference types="database"/&gt;

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

    import * as Statics from "database-statics";
    

    没什么区别
    import {Database} from "database";
    import Statics = Database.Statics;
    

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

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2019-09-24
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多