我在使用jasmine/index.d.ts
。
有几个测试使用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
缺少签名而我的自定义错误类声明不正确?
答案 0 :(得分:1)
这似乎是tsd中的一个错误。
Jasmine docs当然没有表明您可以将Error
的实例传递给toThrowError()
。签名应更改为typeof Error
。
你可以在DefinitelyTyped上提交一个问题,但如果你想更快地修复它,最好用原始的Jasmine示例作为测试代码提交一个pull请求。