多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

一份 schema 同时管住运行时和类型,和那纸改变一切的专利

一份 schema 同时管住运行时和类型,和那纸改变一切的专利 今天一个接口返回和文档不一样的解药一段关于晶体管的专利故事还有一句用来给这个故事收尾的名言。Zod把接口返回长什么样写成一份可执行的约定前端最经典的一类事故后端文档说data.list是数组实际返回了null说price是数字实际是字符串12.50。于是你在代码里塞满if (!res?.data?.list?.length) return还是挡不住线上报错。Zod官网 zod.dev仓库名colinhacks/zod的思路是用一份 schema 同时完成运行时校验和类型推导。它不依赖任何东西也不要求你必须上 TypeScript——纯 JS 项目一样能用它做校验。npmi zodimport{z}fromzod// 1. 定义接口应该长什么样constpoiSchemaz.object({code:z.number(),data:z.object({list:z.array(z.object({id:z.string(),name:z.string(),// 后端偶尔给 null这里明确容错并给默认值location:z.string().nullable().default(),price:z.coerce.number(),// 12.50 - 12.5})),total:z.number().int(),}),})// 2. 校验safeParse 不抛异常返回 { success, data | error }constresawaitfetch(/api/poi/list).then(rr.json())constparsedpoiSchema.safeParse(res)if(!parsed.success){console.error(parsed.error.issues)// 精确指出是哪个字段、期望什么return}render(parsed.data)// 到这里数据形状是可信的// 3. 如果是 TS一份定义同时拿到类型不用再手写 interfacetype PoiRespz.infertypeofpoiSchema对做地图后台的你三个最省心的场景接口对齐新接口进来先写 schema字段和后端联调时一改就对得上后端偷偷改结构时报错信息直接指出是data.list[3].price类型不对而不是等页面渲染出NaN表单校验z.string().email()、.min(6)、.regex()这些链式写法本身就是校验规则不用维护一套单独的校验逻辑配置 / URL 参数解析z.coerce.number()一行解决query 参数永远是字符串这个老问题?zoom11直接变数字值得注意的取舍Zod 不是免费的——它比手写两个 if要重一些schema 定义本身也需要维护。适合用在边界接口入口、表单提交、外部配置而不是每个组件内部的每次判断。把它当成外部世界进来的海关而不是 everywhere 收益最划算。顺带一个 Vue 2 的小落地方式把 schema 定义抽到src/schemas/目录在封装的请求函数里统一safeParse业务组件就完全不用感知校验逻辑了。历史上的今天1950 年 10 月 3 日晶体管拿到美国专利76 年前的今天US Patent2,524,035正式授权发明人是 John Bardeen 和 Walter Brattain归属贝尔实验室。这份 1948 年提交的专利保护的东西叫点接触晶体管。它本身不算好用的产品——两根金线压在锗片上靠一个尖点接触实现放大噪声大、良率低很快就被结型晶体管取代。但它标志着电子学从真空管时代翻篇进入固态时代。三个数字放在一起看很刺眼上一期提到的 ENIAC约 30 吨、1.8 万个真空管、只能停机改线路1950 年这份专利里的器件手指头大小不用预热几乎不烧你手里那部手机上百亿个晶体管顺便说两个故事里最好玩的点。第一贝尔实验室自己并没把它当成摇钱树。晶体管刚出来时成本高、性能还不稳定公司更愿意见它被广泛采用而不是自己垄断。于是在 1950 年代相关专利以较低的门槛对外授权日本厂商正是抓住这个窗口起家的——Sony 买到授权后做出晶体管收音机一路做成了消费电子巨头。一项看不上的技术授权喂出了后来最大的竞争对手。第二Bardeen 这个人。他是唯一一位两次拿到诺贝尔物理学奖的人1956 年因为晶体管1972 年因为超导的 BCS 理论。整个物理学史上只有他做到了这一点而且两次都是完全不同的领域。我们今天写的所有代码说到底都是在那块被两根金线压着的锗片上一路盖了七十六年的楼。一句名言任何足够先进的技术都与魔法无异。—— Arthur C. Clarke《2010 太空 Odyssey》作者“克拉克第三定律”放在晶体管后面特别合适。1950 年那根压在锗片上的金线如果拿到今天给一个只懂继电器的人看他也只会说这不就是开关吗——真正让他无法理解的是从开关到上百亿个开关组成能跑 JavaScript 的东西之间那条完整的路径。而对我们这一行这句话还有反向的一层你觉得理所当然、不再觉得神奇的东西恰恰是你已经理解得不够深的东西。每次await fetch()背后是一整套网络协议栈每个if语句背后是一堆晶体管在开关。最后今天这两样放在一起其实是一个关于抽象的故事。Zod 做的事情是把接口约定从脑子里的隐性知识变成一份能跑、能报错、能推导类型的代码晶体管做的事情是把开关这个动作从机械结构里解放出来于是后来的所有人都能在它上面继续盖抽象的楼汇编、高级语言、框架、你今天下午要写的那个组件。抽象的代价是离底层越来越远。好处是一天能做完更多事坏处是遇到诡异 bug 时你完全不知道脚下那 76 层里哪一层出了问题。所以偶尔回头看看这些底下的东西值不值我觉得值。它不会帮你今天的需求写得更快但它会让你的判断更稳——比如知道为什么接口不可信比知道怎么写safeParse更根本。
返回列表