2017-08-05 52 views
1

在我的角度分量I類有用來處理事件以下模式:它是一個TypeScript反模式來動態調用存儲在文字中的成員函數嗎?

private keyHandlers = { 
    'ArrowDown': function ($event) { 
    this.handleArrowDown($event); 
    }, 

    'ArrowUp': function ($event) { 
    this.handleArrowUp($event); 
    }, 
}; 

然後@HostListener像這樣:

@HostListener('keydown', ['$event']) 
    onKeyDown($event: KeyboardEvent) { 
    if (typeof this.kbdHandlers[$event.code] === 'function') { 
     this.keyHandlers[$event.code]($event); 
    } 
    } 

然後,再往下我有指定爲私人的個別處理器這個類的成員:

private handleArrowDown($event) { 
    // ... 
} 

private handleArrowUp($event) { 
    // ... 
} 

然而"noUnusedLocals": true,規則似乎不喜歡它,抱怨關於handleArrow *方法從未使用。所以我的問題是 - 這種方法是否被認爲是TypeScript中的一個反調試器,還是有辦法滿足編譯器並注意這些成員?

+1

什麼是'this'在keyHandlers職能範圍?與句柄*()相同? – devio

+0

是的,它是一樣的 – user776686

+0

你的keyHandlers樂趣怎麼不傳遞$事件,雖然你期望它? –

回答

2

答案是肯定的,不是。

TypeScript不鼓勵動態參考,因爲它無法分析您的代碼並檢測到這種用法。所以,不幸的是,它會在這種情況下抱怨。

它有很好的幫助你的意圖,但它沒有做正確的事情。換句話說,它沒有足夠的知識去做正確的事情。

另一方面,它絕對不應該「禁止」這種用法,因爲TypeScript是JavaScript。因此應該有辦法來緩解這種情況。

事實上,它是在一個討論:https://github.com/Microsoft/TypeScript/issues/9448

現在,我會建議打開noUnusedLocals關閉(我知道,那會傷害它傷害了兩種方式)。

指出的@jmlopez,這裏有兩種解決方案:

export class SomeComponent { 
    private keyHandlers = { 
    // Specifying `this` will be processed by the compiler to make the function as used. 
    'ArrowDown': function (this: SomeComponent, $event) { 
     this.handleArrowDown($event); 
    }, 
    // Arrow function will have the same effect. 
    'ArrowUp': ($event) => { 
     this.handleArrowUp($event); 
    } 
    } 
    onKeyDown($event) { 
    if (typeof this.keyHandlers[$event.code] === 'function') { 
     this.keyHandlers[$event.code]($event); 
    } 
    } 
    private handleArrowDown(_event) { 
    // ... 
    } 

    private handleArrowUp(_event) { 
    // ... 
    } 
} 
+0

感謝您的輸入。我實際上一直試圖重構我的代碼以使用上述方法,認爲這將是更好的編碼方式。但後來我碰到了這個問題。意識到我對TypeScript的瞭解有限(可能使用它的50%的力量),我認爲我可能剛剛陷入了無知的陷阱中,比如錯過了一些類型轉換。實際上,對我來說這並不意味着TypeScript在這種情況下會感到困惑,並且不會 - 我不會放棄noUnusedLocals - 與重構我的事件處理程序相比,我從中看到更多的好處:)再次感謝。 – user776686

+0

@ user776686看到我對這個問題的評論https://github.com/Microsoft/TypeScript/issues/9448#issuecomment-321162238,似乎你有兩個選擇,如何處理你發佈的問題。 – jmlopez

+0

感謝@jmlopez升級問題。我經常忘記使用箭頭功能 - 這可能是一個解決方案。順便說一句,如果你相信我的問題可以而且應該改寫,請隨時編輯它:) – user776686

相關問題