六种 TypeScript 校验方案实测:难点是让它们说同一件事
来源:dev.to — 2026-10-28
📋 概述
作者维护 is-kit,长期在「要不要上 schema 库」这条边界上纠结,于是换了个问法:这些库到底是不是在解决同一个问题。他用同一个 User 类型和同一套运行时规则(id 是字符串、name 为 1 到 100 个 UTF-16 编码单元、age 为 18 到 120 的整数、role 只允许 admin 或 user、额外键在根和 profile 内都要拒绝、不做类型转换),分别用手写守卫、is-kit、Runtypes、Valibot、Zod、ArkType 和 typia 实现,再编译、用同一批夹具测试、测量独立浏览器打包体积、跑一个稳态基准。最难的不是让七个方案编译通过,而是让它们表达同一件事:「最长 100 字符的字符串」在不同库里意味着不同的运行时契约,Zod 内置长度按 Unicode 码点算,为保住 UTF-16 口径只能用 refine 手写。
🔑 核心要点
- 同一个 User 契约写了七遍,最难的是语义对齐而不是编译通过
- 「100 个字符」在不同库里含义不同,Zod 按码点计,要保住 UTF-16 口径得手写 refine
- 手写守卫在单个边界很划算,代码库一大就变成自己维护一套小守卫库
- 选库要先问需要什么:布尔判定、结构化错误、转换流水线还是表单与 OpenAPI 生态
💡 金句
“The hardest part was not making seven validators compile. It was making seven validators mean the same thing.”
译:最难的不是让七个校验器编译通过,而是让七个校验器表达同一个意思。
← 返回 dev.to 首页