首先,我想了解为什么某些 TypeScript 定义文件以两种形式给出(我将尝试通过 lodash
示例来说明这一点)。
第一个是“基于命名空间”(来自 @types/lodash
定义):
export = _;
export as namespace _;
declare var _: _.LoDashStatic;
declare namespace {
(...)
}
第二个是“基于模块”(来自
typings
模块定义):declare module 'lodash' {
var _: _.LoDashStatic;
namespace _ {
(...)
}
export = _;
}
同一个库的两个定义源显示了不同的方法。这里的权衡是什么以及为什么
@types/...
中的一些类型来源在第一个有利于第二个?我在将“基于命名空间”的定义与位于我的项目范围之外的共享代码一起使用时遇到了一些问题,因此我更喜欢“基于模块”的定义。
好了,第二步来了。我想标准化这些定义并且只使用
@types/...
source 但是当我得到“基于命名空间”的定义(如 lodash
)时,我想编写一些自定义定义(尽可能短),以“基于模块”的方式重新导出该命名空间。我试过这样的事情:
declare module "lodash" {
import * as x from "lodash";
var _: x.LoDashStatic;
namespace _ {}
export = _;
}
这当然不起作用(除了没有
cannot find module...
错误之外),但我认为这几乎表明了我在这里想要完成的事情。我的目标是使用
@types/lodash/index.d.ts
中声明的命名空间并使用模块声明将其导出到不同的文件中(如 custom_typings/lodash.d.ts
)。总结起来有两个问题:
最佳答案
经过这么多时间寻找解决方案,我终于让它工作了!
/** index.d.ts */
import './models';
// tslint:disable-next-line:no-namespace
declare namespace MyLib {
export interface A {
// ...
}
// ...
}
/** extra.d.ts */
// tslint:disable-next-line:no-module
declare module './index' {
export interface B {
// ...
}
// ...
}
两个A
& B
然后作为 MyLib
的一部分可供消费者访问命名空间。此外,您可以正常访问
B
在 index.d.ts
中定义的命名空间范围内.我同意语法不是很好,但它确实有用。
lodash 类型中使用了类似的方法:
在我上面的 POC 中,我更喜欢使用 es6
import
语法,lodash 类型使用 /// <reference
.这两个选项都有效,因此由您决定。
关于typescript - 如何在模块声明中重新导出命名空间定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41789096/