我正在编写一个模块,为我们团队正在使用的测试套件添加一些功能。这是一个包含主typescript文件的项目,它包装了项目中的其他导出。
指数d、 ts:
export * from "./OneModule"
export * from "./AnotherModule"
其中一个模块具有向添加新方法的功能
Chai.js
断言库。这是通过使用其函数来添加新方法来实现的,例如:
assertion.addChainableMethod('newMethod', callback, chainCallback)
将增加编写语句的能力,如
expect(something).to.be.newMethod()
. 但TypeScript无法识别这些新方法,因为
@types/chai
显然没有这些功能。
我创建了要与Chai断言合并的接口定义,如下所示:
declare namespace Chai {
interface Assertion {
newMethod(something: string): Assertion;
newMethod: Assertion;
}
}
AddChaineableMethod添加了新方法,因此它也可以作为
expect(something).to.be.newMethod.equals()
这就是为什么它必须被定义为属性和方法。
问题是,无论我如何将上述声明添加到索引中。d、 ts新断言在导入项目中不可见。我怀疑它以某种方式包装在模块名称空间中(但我可能对此大错特错)。我知道我能行
@types/newAssertions
并在那里定义它们,但这需要用户在
package.json
,还要求我们的开发人员同时处理2个项目。如何导出我的Chai名称空间扩展和所有模块?
我所做的最好的事情是:
declare module 'my-module' {
function AddNewAssertions(chai: any, utils: any): void;
}
declare namespace Chai {
interface Assertion { //same as above }
}
但有了这个,我无法公开其他模块,只有当我只公开AddNewAssertions函数时,它才起作用,该函数添加了这些断言。尽管如此,这还是很有效。