用 TypeScript 定義函式
JavaScript 裡,函式亦物件,我們可以用針對物件的方式來描繪函式的外觀,也可以用 TypeScript 提供的 Namescape 定義。 方法一: 用 Interface 定義 這個方法僅適用於 TypeScript 3.1 以上的版本,舊版請使用 Namespace 定義法 。 ``` enum MouseButton { Left = 1, Middle = 2, Right = 3 } interface ClickEvent { mouseButton: MouseButton } interface EventTarget { (e: any): void autoRemove: boolean } interface ClickEventTarget extends EventTarget { (e: ClickEvent): void } const click: ClickEventTarget = function clickHandler(e: ClickEvent) { if(e.mouseButton === MouseButton.Left) { // do something... } } click.autoRemove = false export default click ``` 先分別定義二個 interface , EventTarget 與 ClickEventTarget (要只定義一個也行,這裡僅是順便展示 interface 繼承的寫法), 且 ClickEventTarget 繼承自 EventTarget ,該 interface 除了描述 function signature ,還要求該 function 必須有 autoRemove 這個屬性,且是布林型態。接著宣告 click 常數,並設定它的型態為 ClickEventTarget , 此時 Vscode 會抱怨常數 click 遺漏了 autoRemove 屬性,所以下一行就可以設定常數 click 的 autoRemove 屬性,這樣就完成了。 我們也可以將函式宣告與賦值拆開來,像底下這樣的寫法也行: ...