發表文章

TypeScript 教學: 建構 EventEmitter/EventTarget 類的定義式

圖片
 前言 TypeScript 是一套強大的工具,能夠幫助我們描述與定義 function signature ,甚至還可以做到當呼叫函式時,指定其中一項參數值,另一個相依參數的型態 ( Type ) 就能被 TypeScript 自動推論 ( Infer ) 出來,接下來就以 NodeJS 的 EventEmitter 為例,示範如何做到。 以下範例程式碼可在底下自由複製與研究 https://github.com/dustin71728/typescript-study/tree/master/src/example/event-trigger-on 本文重點: 了解如何使用 TypeScript 去表達函式參數間的相依關係 善用 Type Alias 、 Mapped Types 等技巧,減少 TypeScript 重覆與累贅的定義 了解 TypeScript 在自動推論可能會帶來的限制,與因應之道 範例一 我們先定義一個 interface 出來,有 2 個屬性 ( Properties ),分別為 trigger & on ,定義如下:  // interface.ts export interface EventHandler { trigger : ( event : string , args : Record < string , unknown > ) => void on : ( event : string , callback : ( args : Record < string , unknown > ) => void ) => void } 上面的 TypeScript Definition 定義了以下幾件事。 EventHandler 描述某個物件的"形狀" ( Shape )。 該物件必需要有 trigger 與 on 這 2 個屬性。 trigger 必需是一個 function ,接受 2 個參數,第一個型別是 string ,第二個型別是個 object 。 Record<string, unknown> 表示該物件可以有任意屬性名稱,且屬性值是...