Rick's DevNotes
筆記關於我作品集
筆記類別
  • 全部
  • DockerDocker
  • NetworkNetwork
  • RxJSRxJS
  • NginxNginx
  • TypeScriptTypeScript
  • Data_Structure_And_AlgorithmData Structure And Algorithm
  • JavaScriptJavaScript
  • PostgreSQLPostgreSQL
  • ReactReact
  • GitGit

© 2026 Rick's DevNotes. All rights reserved.

# TypeScript

更新時間:2025/08/29

建立時間:2024/09/26

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 又被吃掉了!」