2016-06-13 149 views
1

我已經使用jasmine/index.d.ts在手稿中編寫了一些測試。Jasmine`toThrowError`手稿定義(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()); 
}); 

UPDATE

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

但是,如果我然後重新添加以前的第三簽名jasmine/index.d.ts然後IDE和TS編譯器都很高興。

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

這表明d.ts缺少類被錯誤聲明的簽名和我的自定義錯誤?

回答

1

這似乎是在tsd中的錯誤。

Jasmine docs當然不表示您可以將Error的實例傳遞給toThrowError()。簽名應更改爲typeof Error

您可以在DefinitelyTyped上提出問題,但如果您希望修復速度更快,最好將原始Jasmine示例的拉請求作爲測試代碼進行歸檔。

+0

謝謝,它看起來像這個問題已經在最新的jasmine.d.ts - 'toThrowError(預計?:new(... args:any [])=>錯誤,消息?:string | RegExp ):布爾;' – james