Jasmine`toThrowError` Typescript定义(d.ts)似乎缺少第三个签名

时间:2016-06-13 14:29:16

标签: typescript jasmine

我在使用jasmine/index.d.ts

的Typescript中编写了一些测试

有几个测试使用toThrowError断言已抛出特定的自定义错误类。

所有测试都通过,但TS编译器抛出以下错误:

error TS2345: Argument of type 'typeof MyCustomError' is not assignable to parameter of type 'Error'.

我检查了茉莉花文档,除非我误解,否则第一个参数可能是错误类。

expect(foo).toThrowError(TypeError);

jasmine index.d.ts仅列出toThrowError的2个签名:

toThrowError(message?: string | RegExp): boolean;

toThrowError(expected?: Error, message?: string | RegExp): boolean;

我对TS的理解仍然有些不稳定,但我想知道是否还应该有第三个签名允许第一个参数是扩展Error的类,而不是实例?类似的东西:

toThrowError(expected?: typeof Error, message?: string | RegExp): boolean;

我说'类似',因为我尝试将其添加到.d.ts,但是后来出现以下错误:

error TS2345: Argument of type 'typeof MyCustomError' is not assignable to parameter of type 'ErrorConstructor'.

自定义错误类

class MyCustomError extends Error {

    constructor() {
        super('A custom error message.');
    }
}

测试逻辑

it('should throw an error', () => {

    var obj = new MyObject();

    expect(() => obj.doSomething()
        .toThrowError(MyCustomError);
});

防止TS错误的当前解决方案

如果我将错误作为实例,则TS错误将停止。

it('should throw an error', () => {

    var obj = new MyObject();

    expect(() => obj.doSomething()
        .toThrowError(new MyCustomError());
});

更新

it('should throw an error', () => {

    var obj = new MyObject();

    expect(() => obj.doSomething()
        .toThrowError(TypeError);
});

所以我发现如果我将测试中的错误类型更改为TypeError我的IDE(Webstorm)和TS编译器都抱怨(并且我的测试正确失败):

Argument type TypeErrorConstructor is not assignable to parameter type Error

但是,如果我再将之前的第3个签名添加到jasmine/index.d.ts,那么IDE和TS编译器都很高兴。

toThrowError(expected?: typeof Error, message?: string | RegExp): boolean;

哪些表明d.ts缺少签名而我的自定义错误类声明不正确?

1 个答案:

答案 0 :(得分:1)

这似乎是tsd中的一个错误。

Jasmine docs当然没有表明您可以将Error的实例传递给toThrowError()。签名应更改为typeof Error

你可以在DefinitelyTyped上提交一个问题,但如果你想更快地修复它,最好用原始的Jasmine示例作为测试代码提交一个pull请求。