# better-result 3.0 新增 Result.codec 與可取消非同步重試，並移除 Result.serialize／deserialize／hydrate

> 📖 本站完整內容索引（documentation index）：[llms.txt](/llms.txt)

> 原作者：Dillon Mulroy (@dillon_mulroy) · 策展與摘要：EasyVibeCoding · 平台：X (Twitter) · 熱度：🔥 · 日期：2026-08-03

> 原始來源：https://x.com/dillon_mulroy/status/2083670990165291303

## 證據與延伸閱讀

- [better-result 3.0 新增 Result.codec 與可取消非同步重試，並移除 Result.serialize／deserialize／hydrate](https://x.com/dillon_mulroy/status/2083670990165291303) — 一手來源

## 中文摘要

better-result 3.0 新增 Result.codec 與可取消非同步重試，並移除 Result.serialize／deserialize／hydrate。這次改版強化了型別安全、非同步控制與錯誤處理，但也要求使用者調整既有介面。

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/c140a5f9685f01e2.jpg)
> better-result 3.0 的發布橫幅，展示帶有型別錯誤處理與可組合結果的特徵，並附有安裝指令與分支邏輯圖解

**版本與序列化**　安裝方式為：

```bash
npm i better-result@3
```

`Result.codec` 取代未驗證的序列化輔助工具，改採相容於 Standard Schema 的驗證機制，涵蓋 `Ok` 與 `Err` payload。Codec 可分離 domain type 與 wire type，保留同步或非同步 schema 行為；驗證失敗時分別回報 `ResultSerializationError` 或 `ResultDeserializationError`。若契約不一致本身就代表缺陷，`serializeUnsafe` 與 `deserializeUnsafe` 可移除 codec 錯誤處理層，改為拋出 `Panic`。原有 `Result.serialize`、`Result.deserialize`、`Result.hydrate` 已移除，必須改用搭配明確 serializer 與 deserializer 的 `Result.codec`。

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/223bdf47b02df17d.jpg)
> 使用 Result.codec 定義序列化與反序列化函式並進行非同步呼叫的程式碼範例

**Result 集合操作**　新版新增的 collection combinators 讓並行與異質 Result 流程更容易處理：

- `Result.all` 收集所有成功值，或回傳第一個錯誤。
- `Result.allAsync` 會並行等待輸入，同時維持依輸入順序選取錯誤。
- `Result.partition` 現在支援異質 Results。
- `Result.partitionAsync` 可並行收集成功值與錯誤。
- Tuple 輸入會保留成功值的型別。

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/64ecb85ecffd4613.jpg)
> 展示 JavaScript 程式碼範例，說明如何使用 `Result` 物件的 `all`、`allAsync`、`partition` 與 `partitionAsync` 方法來處理多個非同步或同步的成功與錯誤結果集。

**非同步重試**　`Result.tryPromise` 新增 `TryPromiseContext` 中的 `AbortSignal` 傳遞、取消等待中的重試延遲，以及依錯誤與 context 動態決定的 `delayMs(error, context)` 策略；此外也能設定 retry jitter，並透過包含嘗試次數的 `shouldRetry(error, context)` predicate 判斷是否重試。既有具上限的靜態重試策略仍保持相容。

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/31b2d921812f487b.jpg)
> 展示 JavaScript 程式碼片段的畫面，內容為使用 `Result.tryPromise` 實作動態重試與取消機制（`AbortController`），包含 `try`、`catch`、`signal` 與 `retry` 設定參數。

**TaggedError 與語法**　Tagged error 現在支援完整的 instance-level exhaustive matching；`matchError` 仍可用於結構化 tagged error 與 data-last composition。Tagged error 也能被迭代，因此可直接在 `Result.gen` 中提早中止，例如 `const user = yield* new UserNotFound({ id });`。語法方面移除了尾端 factory call，`TaggedErrorClass<Tag, Props>` 改為 `TaggedErrorClass`，payload type 由 subclass 提供。

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/e1014ddddb0200b4.jpg)
> JavaScript 程式碼片段展示使用 `result.match()` 進行結果與錯誤處理

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/83773586131c0dd0.jpg)
> 2.x 與 3.0 版本的 UserNotFound 錯誤類別定義程式碼對比

**採用與疑慮**　Lucas（@lucasvtiradente）表示自己上週試用過，從此「不會回頭」，但好奇公司是否會允許採用，因為工作環境通常偏好維護歷史較長的 open-source 專案。Dillon Mulroy 回應，better-result 已部署於 Cloudflare 的多個 production applications，也被 Prisma 使用；若公司採用 Prisma，很可能已經將它納入現有 stack。

## 標籤

功能更新, 框架更新, better-result
