2013-12-10 54 views
2

這個非常操場的鏈接曾經在TS 0.9.5之前工作,現在我無法弄清楚如何使它爲我的生活工作。TS 0.9.5中的window.onerror是不可能的。 :)

http://www.typescriptlang.org/Playground/#src=window.onerror=%20function%28eventOrMessage%3a%20any,%20source%3a%20string,%20fileno%3a%20number%29%7B%0A%09//%20place%20your%20body%20here%20%0A%7D;

本質:

window.onerror= function(eventOrMessage: any, source: string, fileno: number){ 
    // place your body here 
}; 

...返回錯誤:

Error 8 Cannot convert '(eventOrMessage: any, source: string, fileno: number) => void' to 'ErrorEventHandler': Call signatures of types '(eventOrMessage: any, source: string, fileno: number) => void' and 'ErrorEventHandler' are incompatible.

回答

3

這看起來像在lib.d.ts我(甚至可能是編譯器)中的錯誤 - 因爲他們已經改變了定義ErrorEventHandler在最新的分支。

在0.9.5,它是:

interface ErrorEventHandler { 
    (event: Event, source: string, fileno: number, columnNumber: number): void; 
    (message: any, uri: string, lineNumber: number, columnNumber?: number): boolean; 
} 

但在主分支,它是:

interface ErrorEventHandler { 
    (event: Event, source: string, fileno: number, columnNumber: number): void; 
} 

在此期間,您可以使用下面的技巧(或編輯lib.d .ts文件來更新它)。

interface TempErrorEventHandler { 
    (event: Event, source: string, fileno: number, columnNumber: number): void; 
} 

var test1: TempErrorEventHandler = 
    function (event: Event, source: string, fileno: number, columnNumber: number): void { 

    } 

window.onerror = <ErrorEventHandler> test1; 
+1

老兄,你真聰明。這麼聰明。我對TS不夠了解,但是有兩種無名的方法是無效的嗎? window.onerror如何知道要調用哪個實現? –

+0

該接口表示一個帶有兩個重載的函數 - 因此TypeScript將檢查參數列表以確定哪個被調用(然後將知道適當的返回類型)。我不聰明 - TypeScript傢伙非常聰明 - 編譯器中的類型推斷超級棒。 – Fenton

+0

史蒂夫和巴薩拉特你又救了我沮喪!順便說一句,這已經成爲CodePlex的一個問題?我可以看到這個:https://typescript.codeplex.com/workitem/1570但是這是指0.9.1.1。目前我正在努力解決這個問題,但最好能在TS中正確解決這個問題。 –

5

正如Steve fenton所說。另外,您可以使用這兩個功能之間共同特徵:

window.onerror= function(eventOrMessage: any, source: string, fileno: number, colnumber?:number):any{ 
    // place your body here 
}; 
+0

謝謝bassarat。我從你的答案和@steve-fenton中學到了一些東西。我把這個操場腳本放在一起,說明了與這個問題有關的一些有趣的事情。 http://bit.ly/18BvQ8v你的答案當然更清晰,但史蒂夫的回答確實炫耀了其他方式來彎曲語言,他是第一個,所以我將他作爲接受的答案。 –

0

基於basarat解決方案(我只是添加可選的錯誤參數,可能是有幫助的):

window.onerror = function(errorMsg: any, url: string, lineNumber: number, colNumber: number, error: { stack?: string } = null) { 
    // .. error handler 
};