超越 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 表达式支持模式匹配,更加函数式

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

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

👇 参考文献:

相关推荐
星空1 小时前
html\css\js入门
javascript·css·html
重生之我是Java开发战士1 小时前
【Java SE】多线程(三):单例模式,阻塞队列,线程池与定时器
java·javascript·单例模式
lijgvnns1 小时前
个人AI编程工具的vibe coding实践:从爬虫到导出Excel的全流程
开发语言·javascript·ecmascript
এ慕ོ冬℘゜1 小时前
jQuery 高可用多图上传组件(企业级封装 + 踩坑全解 + 可直接上线)
前端·javascript·jquery
爱勇宝2 小时前
AI 时代,前端工程师的话语权正在下降?
前端·后端
kymjs张涛2 小时前
一个月,纯VibeCoding,全平台云笔记APP
前端·javascript·后端
巴勒个啦2 小时前
esbuild 插件实战:5个真实场景带你自定义构建流水线
前端·angular.js
狗头大军之江苏分军2 小时前
前端路由是怎么来的
前端·javascript·后端