TypeScript:扩展模块时如何编写定义?

时间:2016-02-29 08:59:44

标签: typescript chai

我在TypeScript测试中用帮助器扩展了Chai。

import * as chai from 'chai';

chai.use((_chai) => {
  let Assertion = _chai.Assertion;
  Assertion.addMethod('sortedBy', function(property) {
    // ...
  });
});

const expect = chai.expect;

在同一文件测试用例中使用此方法:

expect(tasks).to.have.been.sortedBy('from');

编译器会给出错误" Property' sortedBy'在类型'断言'"。

上不存在

如何将sortedBy的声明添加到Chai.Assertion

我尝试添加模块声明,就像其他Chai插件模块一样,但它不起作用。

declare module Chai {
  interface Assertion {
    sortedBy(property: string): void;
  }
}

我不想让帮助者成为一个单独的模块,因为它是微不足道的。

2 个答案:

答案 0 :(得分:3)

尝试以下方法:

像这样在chaiExt.ts中扩展chai:

declare module Chai 
{
    export interface Assertion 
    {
        sortedBy(property: string): void;
    }
}

在chaiConsumer.ts中消费:

import * as chai from 'chai';
//...
chai.expect(tasks).to.have.been.sortedBy('from');

[编辑]

如果您使用'import' - 您将文件转换为外部模块并且不支持声明合并:link

答案 1 :(得分:0)

您的代码是正确的。默认情况下,模块和接口在TS上打开,因此您可以重新声明并扩充它们。

通常,我在这种情况下所做的是:我在与项目相同的文件夹中创建一个globals.d.ts文件,以便自动加载.d.ts,然后我添加你的类型定义。

declare module Chai {
  interface Assertion {
    sortedBy(property: string): void;
  }
}