假设我有一个声明具有某些属性的命名空间的模块。例如:
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'
。
我想我的问题的总和本质上是:有没有办法从另一个模块中声明的模块中导出命名空间?
答案 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
文件的两个模块在第一种情况下都需要存在