TypeScript 筆記 - satisfies、as const、readonly
在 TypeScript 的世界裡,這三個東西——satisfies、as const 和 readonly——常常讓人霧煞煞,好像長得有點像,但其實個性完全不同。搞清楚它們,就像分辨三個長得很像的兄弟:一個是挑剔的檢查官、一個是超級固執鬼、另一個則是表面嚴肅但其實只管門面。
先來看 satisfies。他不會改變變數的真實樣子,但會在旁邊指指點點,確保你寫的東西「至少要符合標準」。比方說:
這裡 satisfies 就像在說:「好啦,你這個物件長得 OK,的確能塞進 Record<string, string> 裡。」但它同時又保留了原本的精確字面量,沒有偷偷把 / 放寬成一般的 string。這就是它的招牌特色:檢查,但不改動。
再來看看 as const。他是個「固執鬼」。只要用了它,整個值就會被冰封,並且強制變成 Type Literal + deep readonly,什麼都動不了。舉個例子:
結果是 method 永遠都是 'GET',headers 也變成只讀陣列。你要 push 一個新 header?別想了,編譯器會立刻攔下來。這在定義常數設定時超好用。
最後輪到 readonly。它比較像是「只管門口的保全」。它會在型別層級幫你標記「這個屬性或陣列不能隨便重設」。但它的管轄範圍只有外層,裡面的人(巢狀物件)怎麼鬧,它不管。舉例:
所以,簡單來說:satisfies 是負責驗證的稽核員,as const 是什麼都不准你動的冷酷掌櫃,而 readonly 則是半吊子的保全,表面嚴格但只管一層。搞懂這三者的差異,未來我們就能優雅(甚至有點得意)地跟同事解釋:「啊這個情境用 satisfies 才對啦,不然你 literal type 又被吃掉了!」