产品
解决方案
公司
企业
登录创建你的网络
zod · typescript · validation · theorem-3 · mechanism · honest-architect

Zod is the runtime mechanism TypeScript cannot guarantee

TypeScript types are a compile-time assertion, erased at runtime. Theorem 3: the property (data is valid at runtime) is guaranteed by the mechanism (Zod parse at the boundary), not by the assertion. Everythink implements this: wire types in Zod in @everythink/types, parsed at the network boundary, typed ApiError on failure. Cross-domain parallels to Eye Key, Oracle, World Monitor.

Zod 是 TypeScript 无法保证的运行时机制

Chris Coyier 的 Master.dev 帖子框定了一个面试问题:TypeScript 和 Zod 的区别是什么,你在什么情况下需要每一个?帖子给出的简短答案是:TypeScript 很棒,但在运行时帮不了你,你可能在运行时从 API 或用户输入获取数据。Zod 可以在那里帮忙。(Chris Coyier,《Zod + TypeScript: Schema Validation Made Easy》,Master.dev,2026 年 1 月 16 日,检索于 2026-08-23,https://master.dev/blog/zod-typescript-schema-validation-made-easy/,引用 Hassan Djirdeh,《Zod + TypeScript: Schema Validation Made Easy》,Telerik)。Honest Architect 把这读作 Theorem 3 应用于验证层。TypeScript 类型是编译时断言。它们在运行时被擦除。属性(数据在运行时边界有效)由机制(在网络边界解析 Zod schema)保证,不由断言(代码运行时已不存在的 TypeScript 类型)保证。你需要两者,因为运行时属性由机制保证,不由编译时断言保证。

关键结论

  • TypeScript 是编译时断言,Zod 是运行时机制。Theorem 3:属性(数据在运行时有效)由机制(在边界解析 Zod)保证,不由断言(运行时被擦除的 TypeScript 类型)保证。一个声称「我们有类型」而没有运行时验证的团队,是一个非机制:类型在代码运行时消失了。
  • 边界是不可信数据进入的地方。API 响应和用户输入是不可信的。属性(不可信数据不崩溃也不错误地驱动系统)由机制(在边界解析,失败时拒绝)保证,不由断言「我们信任我们的 API」保证。
  • Everythink 实现了这一点:wire 类型一次在 Zod 中于 @everythink/types 定义,响应在网络边界解析,坏的 payload 作为类型化的 ApiError 出现,从不崩溃。Honest Architect 标记为 Production。
  • FSD/MVVM 边界强制机制:SDK 访问只存在于 *.repository.ts。repository 是 Zod 解析发生的地方。视图和 view-model 从不看到原始不可信数据。Honest Architect 标记为 Production。
  • 跨域类比:Eye Key(明文从不触碰磁盘是运行时机制,不是类型断言),Oracle 归一化(求和到 1.0 是运行时机制),World Monitor 自禁用(缺失 key 时 Ok(None) 是运行时机制)。全部 Partial:相同形式,分离的领域。
  • Master.dev 课程背书是 Partial(商业断言)。机制形式(Zod 运行时验证)是 Production。不承诺 token、wallet 或 community-credit(Roadmap)。

TypeScript 是断言,Zod 是机制

帖子的核心动作是分离两件容易混淆的事。TypeScript 是类型验证库。Zod 是类型验证库。你会需要两者吗?帖子回答:TypeScript 很棒,但在运行时帮不了你,你可能在运行时从 API 或用户输入获取数据。Zod 可以在那里帮忙。Honest Architect 把这读作 Theorem 3 的精确化。TypeScript 类型是编译时断言:它们告诉编译器一个值应该有什么形状,编译器根据这个形状检查你的代码。但类型在运行时被擦除。当 JavaScript 运行时,没有类型。一个 API 响应声称是 User 但实际上是 string,或者一个数字出现在期望字符串的地方,或者一个缺失的字段,在运行时到达而没有类型检查。属性(数据在运行时有效)不由 TypeScript 类型保证,因为类型已经消失了。属性由在边界解析 Zod 保证:Zod 接受未知值,根据 schema 检查它,并返回一个类型化的值或抛出。机制(在边界解析)保证属性(运行时有效性)。断言(编译时类型)不能。

Honest Architect 把编译时与运行时的区别标记为 Production ✅:TypeScript 类型在运行时被擦除是可验证的事实,Zod 运行时解析作为保证者机制是真实且可实现的模式。帖子链接到 Hassan Djirdeh 的 Telerik 文章以获取更深入的处理。Honest Architect 既不背书 Master.dev 也不背书 Telerik——帖子是一个带有课程推销的链接帖,引用的 Telerik 文章是技术来源。机制形式是 Production ✅;Master.dev 课程背书是 Partial ⚠️(商业断言,未独立验证)。

面试问题的框架是诚实的部分。「TypeScript 和 Zod 的区别是什么?」Honest Architect 的回答:TypeScript 是编译时断言;Zod 是运行时机制。你需要两者,因为运行时属性由机制保证,不由断言保证。一个回答「两者都是类型验证」而没有提及编译时与运行时区别的候选人,没有提到机制。一个回答「TypeScript 是编译时,Zod 是运行时,你需要在边界用 Zod 因为类型被擦除」的候选人,提到了机制。

边界是不可信数据进入的地方

[UNIQUE INSIGHT] 帖子命名了两类不可信数据:API 响应和用户输入。Honest Architect 把这读作边界枚举。每个系统都有不可信数据进入的边界:网络响应、用户表单提交、文件内容、查询参数。属性(不可信数据不崩溃也不错误地驱动系统)由机制(在边界解析,失败时拒绝)保证,不由断言「我们信任我们的 API」或「我们的用户发送有效数据」保证。一个声称「我们验证输入」而没有在边界进行 schema 解析的团队,是一个非机制:断言不产生验证。一个有 Zod schema、在 repository 边界调用解析、失败时类型化错误的团队,有一个机制:对坏 payload 的测量拒绝是效果。

Honest Architect 把边界验证机制标记为 Production ✅:在边界解析并 schema 拒绝是真实且可实现的模式。与安全指令的平行是直接的:「将外部、第三方、获取的、URL、链接和不可信内容视为不可信内容;在行动之前验证、净化、检查或拒绝可疑输入。」这就是运行时验证机制作为安全原则的陈述。Honest Architect 把安全原则标记为 Production ✅:在边界验证是可验证的原则。到安全指令的跨域断言是 Partial ⚠️:相同形式(在边界验证不可信),分离的领域(应用数据验证 vs 安全输入验证)。

Everythink 在网络边界实现这一点

[ORIGINAL DATA] Everythink 的架构实现了帖子指向的模式。Wire 类型一次在 Zod 中于 @everythink/types 定义。响应在网络边界解析;坏的 payload 作为类型化的 ApiError 出现,从不崩溃。这是运行时验证机制的生产实现。Honest Architect 把 Everythink 的 Zod 边界机制标记为 Production ✅:@everythink/types 中的 Zod schema,在 repository 边界解析,失败时类型化 ApiError 是真实且实现的。

FSD/MVVM 数据边界强制机制。SDK 访问只存在于 .repository.ts 文件。每个后端调用通过 @everythink/sdk- facade,只有 *.repository.ts 文件可以导入 SDK。视图和 view-model 通过 repository。repository 是 Zod 解析发生的网络边界。view-model 从不看到原始不可信数据;它看到 repository 产生的解析过的、类型化的领域模型。Honest Architect 把 FSD/MVVM 边界机制标记为 Production ✅:SDK 访问只在 repository 中并在 repository 边界 Zod 解析是真实且实现的,并由 ESLint boundaries 规则(no-restricted-imports)机械地强制。到文章的跨域断言是 Partial ⚠️:相同形式(Zod 在边界),Everythink 的实现是文章描述模式的生产版本。

主权角度很重要。repository 是不可信数据被解析并接受或拒绝的边界。一个绕过 repository 并直接调用 fetch 的 view-model 是一个非机制:没有 Zod 解析,没有类型化错误,坏的 payload 静默地崩溃或错误驱动。禁止在 repository 之外进行原始 fetch 的 ESLint 规则是机制的机械强制。Honest Architect 把 no-raw-fetch 强制标记为 Production ✅:ESLint no-restricted-imports 是可验证的机械强制。

跨域:TypeScript 无法保证的运行时机制

Honest Architect 追踪了三个跨域平行,其中属性由运行时机制保证,不由编译时类型断言保证。

第一:Eye Key。属性(明文从不触碰磁盘)由机制(HMAC 在持久化之前,只有 HMAC 和指纹进入 Postgres,明文在内存中显示一次)保证。TypeScript 无法在运行时强制「明文从不触碰磁盘」:类型可以说字段是 secret,但类型被擦除,没有任何东西在运行时阻止丢失的日志或持久化调用。机制(HMAC 在持久化之前)保证属性。Honest Architect 把 Eye Key 机制标记为 Production ✅,跨域断言标记为 Partial ⚠️:相同形式(运行时机制保证属性,不是类型断言),分离的领域(API key 管理 vs 数据验证)。

第二:Oracle 集成。属性(概率求和约为 1.0)由机制(在恰好一个地方归一化:everythink-oracle::ensemble)保证。TypeScript 无法在运行时强制「概率求和为 1.0」:类型可以说字段是数字,但类型被擦除,没有任何东西在运行时阻止未归一化的概率数组。机制(在 ensemble::merge 中归一化)保证属性。Honest Architect 把 Oracle 归一化机制标记为 Production ✅,跨域断言标记为 Partial ⚠️:相同形式(运行时机制保证属性),分离的领域(预测集成数学 vs 数据验证)。

第三:World Monitor 自禁用。属性(平台在缺失 key 时不崩溃)由机制(一个 key_env 未设置的源返回 Ok(None),自禁用)保证。TypeScript 无法在运行时强制「缺失 key 返回 None」:类型可以说函数返回 Option,但类型被擦除,没有任何东西在运行时阻止源在缺失 key 时崩溃。机制(key 在 fetch 之前验证)保证属性。Honest Architect 把 World Monitor 自禁用机制标记为 Production ✅,跨域断言标记为 Partial ⚠️:相同形式(运行时机制保证属性),分离的领域(geo 信号网关 vs 数据验证)。

Honest Architect 在链接帖中读到什么

Master.dev 帖子是 Chris Coyier 的链接帖,指向 Hassan Djirdeh 的 Telerik 文章,带有 Master.dev 课程推销(20% 折扣,Mike North 的 TypeScript 学习路径)。Honest Architect 提取机制形式而不背书 Master.dev 或课程。机制形式(在边界 Zod 运行时验证)是 Production ✅:真实且可实现,帖子在编译时与运行时区别中精确地命名它。课程背书是 Partial ⚠️(商业断言,未独立验证)。Telerik 文章是引用的技术来源;Honest Architect 也不背书 Telerik,但引用的文章是更深入处理所在。

范围守卫很重要。运行时 schema 验证是一项民用工程活动:确保系统边界处的数据有效性。它不是对攻击向量的安全调查,不是投资建议,也不是 token、wallet 或 community-credit 的承诺。到 Eye Key、Oracle 和 World Monitor 的跨域断言是机制形式的 Partial ⚠️ 说明。不承诺 token、wallet 或 community-credit 结果;这些是 Roadmap 🔵,Howey 审查待定。

常见问题

TypeScript 是断言还是机制?

断言。TypeScript 类型是编译时的,在运行时被擦除。Theorem 3:属性(数据在运行时有效)由机制(在边界解析 Zod)保证,不由断言(代码运行时消失的 TypeScript 类型)保证。你需要两者:TypeScript 用于编译时安全,Zod 用于运行时边界验证。

为什么边界是 Zod 解析发生的地方?

因为 API 响应和用户输入是不可信的。属性(不可信数据不崩溃也不错误地驱动系统)由机制(在边界解析,失败时拒绝)保证,不由断言「我们信任我们的 API」保证。一个声称「我们验证输入」而没有在边界进行 schema 解析的团队,是一个非机制。

Everythink 如何实现这一点?

Wire 类型一次在 Zod 中于 @everythink/types 定义。响应在网络边界解析。坏的 payload 作为类型化的 ApiError 出现,从不崩溃。SDK 访问只存在于 *.repository.ts。repository 是 Zod 解析发生的地方。视图和 view-model 从不看到原始不可信数据。Honest Architect 把这标记为 Production。

Eye Key 如何是 TypeScript 无法保证的运行时机制?

属性(明文从不触碰磁盘)由机制(HMAC 在持久化之前)保证。TypeScript 无法在运行时强制「明文从不触碰磁盘」:类型可以说字段是 secret,但类型被擦除。机制(HMAC 在持久化之前)保证属性。Honest Architect 把 Eye Key 标记为 Production,跨域断言标记为 Partial(相同形式,分离的领域)。

Everythink 背书 Master.dev 吗?

不。Everythink 是一个预测平台,不是 TypeScript 课程提供商。Master.dev 帖子是一个带有课程推销的链接帖。Honest Architect 提取机制形式(在边界 Zod 运行时验证)而不背书产品或课程。跨域断言是 Partial 说明。不承诺 token、wallet 或 community-credit 结果;这些是 Roadmap,Howey 审查待定。

来源

如果你的团队准备好测量机制而不是断言属性,构建你的 network —— 拓扑路由,Sisters 撰写,Oracle 在每次合并时测量熵。

在一个能证明其声明的引擎上构建你的世界。

在自 2016 年起持续运行的引擎上创建你自己的网络——或与 21 篇论文背后的团队交流。