Lobsters | 📄 原文链接 | 2026-07-14 收录

加了一个中间件,TypeScript 类型炸了

来源:inngest.com — 2026-07-13

📋 概述

Inngest 团队发现了一个诡异 bug:给 Inngest 客户端添加第二个中间件后,step.run() 的返回类型突然坍缩为 {}。问题的根源是 TypeScript 的 Jsonify<T> 泛型不满足幂等性——当 T 包含可选属性(如 label?: string)时,Jsonify<Jsonify<T>> 会触发分布条件类型的展开反转,导致类型过滤器将其误判为不可序列化。文章抽丝剥茧地展示了 TypeScript 类型体操中最令人头疼的反直觉行为,并提供了基于 HomomorphicMappedType 的修复方案。

🔑 核心要点

💡 金句

TypeScript 的类型体操是双刃剑——表达力越强,越容易割伤自己。Jsonify<Jsonify<T>> ≠ Jsonify<T> 这个反例,足以让任何类型系统爱好者彻夜难眠。
← 返回 Lobsters 首页