跳到主內容

Theme / 0.9.130

Pstack

用可驗證的工作流程協作,從單一入口學會工程技能

Skills

principle-type-system-discipline | 讓型別排除不合法狀態

區分語意不同的基本值,在外部邊界解析資料,依權威結構衍生型別,並讓編譯器檢查狀態與分支。

principle-type-system-discipline | 讓型別排除不合法狀態

本頁以 pstack-claude 0.9.126 為基準。原文設定 user-invocable: false,通常由 poteto-mode 按需讀取。它適用於靜態型別語言,並非只有 TypeScript。

定位與適用情境

讓編譯器拒絕不可能狀態、語意混用的基本值,以及未處理的變體。外部資料在解析前沒有可信型別。若某份結構定義已是權威來源,應從它衍生型別,不另抄一套平行版本。

例如出貨服務收到訂單事件。UserId 與 OrderId 都是字串,但不能互換。出貨結果只有待處理、成功附追蹤號、失敗附原因三種。若使用數個可選欄位,便可能出現「成功卻沒有追蹤號」或「待處理卻帶失敗原因」的資料。

準備

  • 提供事件的 OpenAPI 結構描述(schema)或其他權威協定,以及接收入口和出貨函式簽章。
  • 準備有效事件、缺少訂單識別碼的事件與識別碼格式錯誤的事件。
  • 確認領域需要哪些狀態、識別碼格式及錯誤處理。上游原則未替此出貨情境定義具體欄位,必須以專案需求為準。

操作步驟

  1. 找出真正擁有資料形狀的權威結構。沿用專案既有衍生方式取得傳輸型別,不另寫一份可能漂移的事件型別。列出傳輸資料與領域模型的對應。
  2. 將語意不同的識別碼分成不同型別,例如品牌型別(branded type)或新型別(newtype)。在建立時驗證一次,避免把兩個同為字串的參數交換後仍能編譯。
  3. 在事件接收邊界解析外部資料,成功後才交給內部出貨流程。型別註記或強制斷言不等於解析,JSON、環境變數與資料庫資料都不能只因來源熟悉就跳過邊界檢查。
  4. 用帶標記的聯集(discriminated union)等結構表達三種結果,讓每個狀態只帶合法欄位。加入窮盡性檢查(exhaustiveness check),並用型別負向案例及邊界輸入測試分別檢查編譯期與執行期約束。

可直接使用的提示詞

套用 principle-type-system-discipline,檢查出貨事件與結果型別。
輸入包含權威 OpenAPI 結構、事件接收入口、出貨函式簽章與有效及無效事件。
區分 UserId 與 OrderId,從權威結構衍生傳輸型別,在邊界解析後才建立領域模型。
將待處理、成功附追蹤號、失敗附原因建模成合法狀態,列出窮盡性檢查方式。
交付型別設計及編譯期、執行期的驗收案例,不用強制斷言假裝完成驗證。
這次只提出方案,不安裝產生器或修改程式。

預期結果與驗收

  • 將 UserId 傳入要求 OrderId 的位置時,型別檢查應拒絕。
  • 成功結果缺少追蹤號時無法建立合法值;新增狀態卻未處理時,窮盡性檢查應指出缺漏。
  • 缺少或格式錯誤的外部識別碼在解析邊界被拒絕,不流入已型別化的內部流程。
  • 傳輸型別可追溯到權威結構,沒有另一份手寫副本。每項編譯與執行期主張都各有對應檢查。

限制與權限

常見誤用是替任意字串加上型別斷言就當成已驗證,或在每個內部函式重做相同解析。品牌型別能防止靜態語意混用,不能自行驗證外部輸入或保證使用者有權操作該訂單。

靜態型別通過也不代表支付、授權或外部系統整合正確。具體 TypeScript 寫法可另參考上游原文指向的 typescript-best-practices;本頁不假設讀者已具備產生工具。本頁未修改型別、安裝依賴或處理真實事件,實作仍受任務權限限制。

延伸閱讀與來源