1、大前端新趋势专场马天琦 2021年08月01日本期议题:探索类型安全的 Node.js Web 框架自我介绍马天琦字节跳动 Web Infra 团队成员Farrow 核心开发者探索类型安全的 Node.js Web 框架探索类型安全的 Node.js Web 框架 类型安全 Node.js Web 框架现状现状 当前 API 设计中的类型问题 Farrow 的类型安全方案 Farrow 未来的规划 总结类型安全 What&Why?类型安全什么是类型安全定义:变量的行为与它的类型相匹配,不存在运行时的类型错误例子 0:访问 null 的属性(null.foo())例子 1:将 string 类型
2、当作 number 类型做运算例子 2:调用对象中不存在的方法类型安全为什么要追求类型安全Well typed programs cannot go wrong.A Theory of Type Polymorphism in ProgrammingRobin Milner 1978.尽可能在编译期通过类型检查提前捕获可能的程序错误,提高代码的健壮性配合编辑器类型提示,类型检查是比单元测试反馈更快、更早、覆盖更全面的实时测试符合类型安全准则的代码,往往是设计更合理、质量更高、编写更优雅的、表达更清晰的Node.js Web 框架现状现状Node.js Web 框架当前 API 设计中的类型问题
3、Express类型问题Hanging Request可以不响应可以远远挂起请求无法在编译期得到约束和提醒类型问题Wrong Response无法在编译期约束 header-body 的响应次序无法在编译期约束只发送一次 body类型问题Monkey Patching修改 req/res 污染全链路中间件的类型动态追加属性或方法,与静态标注的类型有本质矛盾静态类型决定能否赋值给属性,而非属性赋值决定是否包含特定类型类型问题No Runtime ValidationTypeScript 类型在编译后都被抹去在 Input/Output,parse/stringify 中需要运行时类型检查类型问题P
4、oor Type Inference类型推导不友好自动类型转换不友好需要编写繁琐的类型转换和防御逻辑类型问题总结Hanging Request(请求意外挂起)Wrong Response(错误响应内容)Monkey Patching(篡改对象属性)No Runtime Validation(无运行时验证)Poor Type Inference(不友好的类型推导)etc.类型问题总结Hanging Request(请求意外挂起)Wrong Response(错误响应内容)Monkey Patching(篡改对象属性)No Runtime Validation(无运行时验证)Poor Type I
5、nference(不友好的类型推导)etc.只靠*.d.ts,并不能获得充分的类型友好和类型安全特性类型问题总结基于 Express/Koa 可以用打补丁的方式解决一两种类型问题,但不能从根本上解决问题Fastify 提供了基于 JSON Schema 的运行时校验请求内容的方案,但方案与类型系统不贴合要充分解决系统性问题,则需要基于 TypeScript 做全盘的思考类型优先开发(Type-First Development)类型驱动开发(Type-Driven Development)类型问题类型安全的服务端框架设计目标Prevent Hanging Request(阻止请求意外挂起)Re
6、fuse Wrong Response(拒绝错误响应内容)No need to Monkey-Patching(无需篡改对象属性)Embedded Runtime-Validation(内置运行时验证)Excellent Type Inference(出色的类型推导)etc.类型问题类型安全的服务端框架设计目标Prevent Hanging Request(阻止请求意外挂起)Refuse Wrong Response(拒绝错误响应内容)No need to Monkey-Patching(无需篡改对象属性)Embedded Runtime-Validation(内置运行时验证)Excellen