2017-04-13 58 views
1

當我將函數引用作爲參數傳遞給另一個函數,然後在某處調用它時,它會丟失「this」。爲了防止它,我必須將方法轉換爲箭頭函數。這裏是我的意思的例證:當我通過方法參考時,使TS發出警告

class Meeseeks{ 
    private line="I'm mister Meeseeks"; 
    lookAtMe(){ console.log(this.line+', look at me!'); } 
} 
// somewhere else: 
let mr = new Meeseeks(); 
mr.lookAtMe();/// ok, prints fine 
function callIt(fn:Function){ fn(); } 
callIt(mr.lookAtMe);/// this one throws "Uncaught TypeError: Cannot read property 'line' of undefined" 

因此,要解決它是把「lookAtMe」成箭頭功能的唯一途徑:

lookAtMe =() => console.log(this.line+', look at me!'); 

我的問題是:能打字稿提醒我,當我使用函數引用?因爲在編譯時遇到運行時錯誤,所以我討厭它,這就是爲什麼我首先使用TypeScript(我非常喜歡嚴格的類型化語言)。而現在,爲了防止它,我做了全部方法箭頭函數,並且它不適合繼承。

您知道的任何tsconfig條目或tslint條目?

+0

不完全是你所要求的,但是這可以通過構造函數中的一些'bind'來阻止。 – Jokester

回答

-1

不,沒有辦法直接對此提出警告。

有一個suggestion for ESLint to implement it但它沒有實現。

可能做的是使用only-arrow-function TSLint rule來防止行爲發生在第一位。

+0

@Downvoter:爲什麼downvote?這是對這個問題的正確和有效的答案,它想要實現構建過程步驟來防止函數引用。 –

+0

你的假設是用戶不會對任何會對源代碼進行任何修改而報告這些錯誤的方法感興趣,並且任何這樣的方法 - 事實上確實存在 - 根據定義,不僅不能回答他的問題,甚至不值得提及,似乎過於嚴格,並且除OP提供eslint或tsconfig標誌之外的任何內容都不支持。您與ESLint問題的鏈接完全不同。 – 2017-04-13 12:09:40