超越 TypeScript,Flow 强势回归,语法高仿 TS,功能更丰富,类型更安全!

👇 今日要闻

打破信息壁垒,走近全球前端。Hello World 大家好,我是林语冰。

Flow 是一门类型化的 JS 方言,起初是脸书内部的闭源项目,开源后成为 TypeScript 的宿敌,还被 GitHub 第一 UI 库 React 大规模采用。

后来,多边合作的 TS 在静态类型领域脱颖而出,去年更是找到了 AI 时代的风口,直接登顶 GitHub 第一编程语言。

打不过就加入,现在,新版 Flow 强势回归,语法上成为了 TS,类型上质疑了 TS,功能上又超越了 TS。

此外,Flow 重做了官网,推出面向 TS 用户的综合指南,和 TS 全面对比。

本期我们就一起来看看语法神似 TS 的 Flow,为何比 TS 更类型安全,又能否启发 TS 的再进化。

👉 Flow 高仿 TS

新版 Flow 的大多数语法和 TS 高度相似,TS 爱好者可以秒懂 Flow。

举个栗子,Flow 中的类型、变量和函数写法如下:

是不是很眼熟?虽然这是 Flow 常用的基本代码,但语法和 TS 惊人地相似,甚至如果你把这段代码靠背到 .ts 文件中,你会发现 TS 编译器允许 Flow 代码顺利编译,不会报错。

注意,这并不是说 Flow 的目的是 100% 兼容 TS,下文我们会探讨 Flow vs TS 的若干异同点。

但是,这确实是 Flow 从起初质疑 TS 到打不过就加入,然后理解 TS、成为 TS,最终甚至试图超越 TS 的战略路线。

Flow 的天才之处在于,它的高仿语法和 TS 大同小异,这种廉价的学习成本使得 TS 用户丝滑迁移到 Flow 成为可能。

👉 React 专属语法

Flow 和 TS 不同的一点在于,Flow 和 React 都起源于脸书,React 自然成为了 Flow 的重度用户。

新版 Flow 更进一步,为 React 提供了专属语法:

  • component 语法:直接把 React 组件作为一等公民
  • renders 类型:为组件声明组合契约
  • hook 语法:将 hook 声明为区别于常规函数的一等类型

举个栗子,用 Flow 独有的语法来编写 React 组件:

可以看到,Flow 的诞生背景和 React 生态的深度互动,促使 Flow 有能力提供专属 React 的一流支持,这是 TS 所缺失的、或职责之外的功能。

这是一把双刃剑,一方面 React 专属语法可以吸引 React 用户从 TS 迁移到 Flow 生态,享受更棒的类型福利;另一方面,非 React 用户并不需要这些特定功能。

考虑到 React 专有语法是一种可插拔的灵活功能,开发体验影响不大,其他框架的用户可以按需选用,不会增加学习成本,或增加现有项目的技术债务。

👉 类型安全权衡

某些情况下,即使通过 TS 严格模式的类型检查,代码在运行时也会崩溃。为了捕获这些运行时故障,Flow 优化了 TS 类型系统的四种用例。

1. 对象赋值

TS 允许通过间接赋值的方式,给对象传递接口约束的额外属性,比如:

2. 数组赋值

TS 允许将类型放宽的值写入类型收窄的可变数组中,比如:

3. 类型守卫

TS 不会验证类型守卫的函数体逻辑,比如:

4. this 丢失

TS 中,从实例中提取方法会丢失 this 绑定:

可以看到,虽然 Flow 整体语法高仿 TS,但对于部分运行时可能出错的行为,Flow 采取了更加激进的检查策略,确保用户在编写代码时就能及时修正。

👉 Flow 新特性

除了对 React 的一流支持和对 TS 类型系统的修正,Flow 还新增了 match 表达式语句,用于模式匹配。

举个栗子,数据库常见的增删改查操作:

模式匹配是函数式编程语言中的常见功能,Flow 大胆地将其引入。

相较之下,TS 的策略就稍显保守,因为 TS 的底线是成为 JS 的"严格超集"。

如果要在 TS 也引入模式匹配的功能,那么不能只考虑类型系统的设计,还要直接到 TC39 推动相关提案,确保模式匹配被 JS 标准化,TS 才会果断支持。

👇 重点总结

新版 Flow 强势回归,重做了官网,语法成为"山寨版 TS"的同时,功能上还试图超越 TS。

作为 React 的核心技术,新版 Flow 的变化如下:

  • Flow 高度模仿 TS 的语法,学习成本和迁移成本极低
  • 提供了对 React 的一流支持,新增 component 等专属语法
  • 类型安全比 TS 更先进,捕获潜在的运行时错误
  • 增加了 match 表达式支持模式匹配,更加函数式

👍 以上就是本期《前端日报》的全部内容了,如果读完对你有所帮助,可以按赞打卡、在看推荐或转发分享本文。

🙏 已经关注我的粉丝们,我们下期再见啦,掰掰~~

👇 参考文献:

相关推荐
之歆32 分钟前
Vue商品详情与放大镜组件
前端·javascript·vue.js
再吃一根胡萝卜1 小时前
如何把小米 MiMo 接入 CodeBuddy,打造私有 Agent
前端
负责的蛋挞2 小时前
异步HttpModule的实现方式
java·服务器·前端
丹宇码农5 小时前
把 HLS 字幕玩出花:zwPlayer 如何让 M3U8 视频支持全文搜索、翻译与码率自适应
前端·javascript·音视频·hls·视频播放器
2501_943782355 小时前
【共创季稿事节】猜数字游戏:二分法思维与交互式反馈
前端·游戏·microsoft·harmonyos·鸿蒙·鸿蒙系统
GV191rLvq5 小时前
基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
服务器·前端·asp.net
吠品5 小时前
LangChain 里 tool_call_id 为空?一次 MCP 工具集成的排查记录
前端
微信开发api-视频号协议6 小时前
企业微信二次开发中的文件系统设计:媒体资源、临时文件与业务附件
前端·微信·企业微信·媒体·ipad·微信开放平台
柒和远方6 小时前
Phase 7.4 学习博客:为什么多 API 项目需要 Swagger / OpenAPI
前端·后端·架构