位置: 编程技术 - 正文

Flow之一个新的Javascript静态类型检查器

编辑:rootadmin

推荐整理分享Flow之一个新的Javascript静态类型检查器,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

今天我们兴奋的发布了 Flow 的尝鲜版,一个新的Javascript静态类型检查器。Flow为Javascript添加了静态类型检查,以提高开发效率和代码质量。更明确的说,静态类型检查提供的好处像早期错误检查,帮助你发现一些只有在运行时才能发现的错误,以及代码智能感知,它会帮助代码维护,查找,重构和优化。

我们设计Flow的所有功能构建在现有Javascript规范之上。因为Flow主动地在后台工作,所以额外的编译开销很小。Flow并不要求开发者如何编写代码 —— 她用一套复杂的算法分析你熟悉的代码风格。

Flow仍然在初期阶段,但是我们已经在Facebook使用了。我们希望你在自己的项目中愉快的使用,期待你的反馈。可以访问 flowtype.org 快速开始。

总览

Facebook超爱Javascript;它快,表达性好,而且到处运行,是构建产品的极佳语言。同时,因为没有静态类型让开发者困扰。Bug难以发现(比如,崩溃的原因隐藏很深),代码维护犹如噩梦(比如,在不知道所有依赖的情况下进行重构风险很大)。Flow改进了速度和效率促进了开发者在使用Javascript的生成效率。

在Javascript之上添加一层静态系统并不简单。Javascript的积木(building block)表现力极高,一个简单的类型系统并不能精确组合出应有的语义。为了支持不同的Javascript编程范式和习惯,Flow引入了类似数据流(data-flow)和控制流(control-flow)这类通常用于编译时提取语义的分析技术。然后用提取的信息,加上先进的类型原理来做类型推断。当然,仅有一个强力的静态类型分析还不够 —— Javascript代码库会很大,这要求类型检查必须闪电般快速,才能不打断开发者编辑-运行的流程。Flow按模块执行分析,所有的类型都限制在模块边界以内。这最终形成一个高度并行、增量式的检查架构,类似 Hack 。这使得类型检查响应快速,即使是百万行级别代码。

Flow的类型检查是选择性的 —— 你不需要一次性执行检查所有。然而,Flow背后的设计基于假定大多数Javascript的代码类型是隐式静态类型;虽然类型可能不会到处在代码中出现,它们是以一种可以按照代码正确性推理出来的形式存在于开发者的思路中。一旦可能,Flow就去推断这些类型,意味着它可以不需要改动代码就能发现类型错误。另一发面,一些如存在于框架中的Javascript代码,大量使用了反射使得静态类型推断非常困难。对于这种天然动态的代码,类型检查就会错漏百出,因此Flow提供对此类代码添加信任并继续。这种设计在Facebook内部被大量的Javascript代码库所验证:大多数代码没有通过隐式静态类型检查条目,这些条目让开发者可以不用添加注释就能检查代码类型错误。

这使得Flow从根本上区别于其他Javascript的类型系统(如TypeScript),通过弱化的假设大多数JavaScript代码是动态输入的,并由开发者自己表达哪些代码应该是静态类型。通常来看,这类设计会导致检查覆盖率降低:更少的类型错误被检测到,工具不够高效。然而对于某些情况下是合理的,一般这种设计如果没有通过大量额外的努力就无法对实际开发提供足够多的帮助。尽管如此,Flow让你可以简单就获得这种弱化的类型检查,对于现有代码非常有用。

为了解释这种区别,请看下面的例子:

Flow能够发现这个错误(尝试把数字和字符串相乘),然而另一种更加保守的分析需要显式的标注 x 的类型。在这个玩具般的例子里面并不觉得费力,但是在巨型代码库里面几乎无人去做。Flow可以不用添加注释就能发现这个错误 —— 当然前提是开发者想这样做。

类型系统

Flow的类型系统实现了许多期望中的功能。支持标准基本类型( number , string , boolean ),类型之间的隐式转换在除一些特殊情形外是被禁止的。结构类型,如函数、对象和数组也被支持。类型可以是多态的。

也许你会感到意外,Flow没有把 null 和 undefined 当成是上述类型中的任何一种。这两种类型会有多种可能,使用这些类型必须在合理检查的保护之上。其它组合类型(如 string | number )也被支持,这种用法同样需要确保安全。Flow知道缩小类型范围时做动态检查的影响。

让我们用一个例子来描述处理 null 值。下面的程序总是在运行时崩溃,但是一般的类型系统会认为它没有问题:

Flow之一个新的Javascript静态类型检查器

Flow会在编译时期发现这个错误,并指出 x 可以是null( length 属性不应该被访问)。另外,Flow了解这个程序的控制流,所以简单修改就能让这个程序类型正确:

Flow还了解JavaScript复杂的对象模型:构造器,方法,原型和它们动态扩展以及绑定。已经试验性去支持类型的复杂操作如:绑定对象,抽取keys等等。我们希望未来这些功能使得让为框架指定具体类型成为可能。

类型错误通常报告为定义和实际值不兼容:比如函数调用的参数不足,对象中不包含要访问的属性,或者把字符串当成数字使用。

最后,Flow支持动态类型( any ),这种类型可以绕过类型系统检查:比如可用 any 表示静态分析无法准确判断而报错的location(通常使用反射的情况)。另外Flow在弱模式下遇到上述类型且没有注释类型的话,会自动假定为 any 。

扩展性

为了拓展,Flow根据模块和其它模块的依赖关系以及其它模块提供的类型接口,单独对每个模块进行检查。要生成类型接口,Flow可能需要在模块边界上进行注释。

Flow在一个后台运行的持久化服务器上,维护着整个代码库的语义信息,一开始Flow会对整个代码做一次分析,然后当一系列文件改动的时候(可能是单个文件改动或者在切换分支的时候),服务器会增量式更新改动文件以及由于类型关联的其它相关文件的语义信息。这样,当开发者试图获取类型错误时,它们已经在服务器上了,相应几乎是立即的。这种服务器架构与 Hack 构建在同一种技术之上。

兼容性

Flow致力于支持最新的JavaScript标准。目前已经支持各种ES6特性如destructuring, classes, extended objects, optional function parameters,以及核心API扩展(比如Map, Set, Promise, 和 new methods on Object, Array, 和 Math)。其它特性(尤其是模块)正在开发中。Flow支持CommonJS / Node.js 规范的模块。

如果你在JSX上使用的class名字有错误,Flow会发现这个问题:

而且,如果你在React class里面使用了React.PropTypes规范,你可以对JSX上的attributes做静态类型检查:

Flow就会发现 <Hello/> 缺少属性的错误,或者 <Hello name={}/> 属性类型的错误。

更多的关于支持React的细节可以在 文档 中找到。

开源

Flow代码大部分用OCaml实现。代码库在活跃更新并且会在未来几个月快速进化。除了在Facebook范围内的数据代码库中运行外,我们希望Flow的分析引擎能用于构建类似的,无论是JavaScript或者其他的语言工具。请让我们知道你是否想加入!

好了,关于Flow之一个新的Javascript静态类型检查器的全部内容先给大家介绍到这里,后续还会持续更新,敬请关注!

图解Sublime Text3使用技巧 Sublime工具Web编程的我想大家都会知道吧,喜欢用的人也比较多,因为许多技巧,操作都很方便,下边介绍一下如何使用一些开发中常用的技巧!1.Sublime

Javascript实现Array和String互转换的方法 本文实例讲述了Javascript实现Array和String互转换的方法。分享给大家供大家参考,具体如下:Array类可以如下定义:varaValues=newArray();如果预先知道数组的

js实现仿微博滚动显示信息的效果 相信大家空闲的时候都会上上微博,推特等社交网站,每次我登陆微博时,我都会留意一下它有什么变化,小的有一些布局的变化,大的有API接口的改

标签: Flow之一个新的Javascript静态类型检查器

本文链接地址:https://www.jiuchutong.com/biancheng/386437.html 转载请保留说明!

上一篇:浅析JavaScript声明变量(js调用声音)

下一篇:图解Sublime Text3使用技巧(胰腺在人体的哪个部位图解)

  • 房产税如何进行税源采集
  • 销售白酒是否要交消费税?
  • 残保金季报要填上年职工人数
  • 收购农副产品怎么做账
  • 应收账款和应付账款可以抵消吗
  • 高速公路通行费电子发票怎么打印
  • 年金终值系数公式例题
  • 工会基金是扣个人还是扣企业的
  • 建筑工程管理费包括哪些内容
  • 上市公司现金流充足说明什么
  • 外购自用需要缴纳增值税吗
  • 国有独资企业董事会应当在每年
  • 建筑企业资质使用对建造师补充要求
  • 个人取得的咨询费是什么
  • 支付宝转账到银行卡多久到账
  • 安全费用支出范围包括
  • 收到促销商品怎么做分录
  • 转让五年以上住房免征个人所得税吗?
  • 债务重组损失金额
  • 个人去税务局开劳务发票要交多少税
  • 发生广告费用会计分录
  • 折让冲减的产品销售收入
  • 公司注销银行账户流程
  • 企业一次性支付多年费用 不摊销
  • 化妆品的消费税率多少
  • 汇算清缴税务审计报告
  • 一般纳税人认定管理办法
  • bios如何设置光盘启动项
  • 跨越红字专用发票开票流程
  • 股利分配账务处理
  • 无形资产可以占多少比例
  • linux系统的文件与目录操作
  • quickres.exe - quickres是什么进程 作用是什么
  • 工程机械设备租赁价格
  • 对公账户发放工资要固定几号打吗
  • 系统托盘无法隐藏文件夹
  • win11 zen2
  • 代理买卖证券款是经纪业务费用吗
  • 清算公司资产怎么入账
  • 对公账户开户费开户的时候就要交钱吗
  • 未结算未取得发票怎么办
  • 专利权的期限是指专利权的实际有效期限
  • 工业会计做账的基本流程
  • 收到单据
  • 欧罗巴山国家公园旅游攻略
  • 菲律宾薄荷岛疫情最新消息
  • web攻防之业务安全实战指南
  • h5页面跳转小程序不显示按钮
  • react的高阶组件理解
  • 工程收到款项会计分录
  • vue导航解析流程
  • phpcms是什么框架
  • 资本化支出的账务处理
  • 承包安装工程活怎么接
  • 工会的钱怎么取出来
  • 资产负债表和现金流量表之间的勾稽关系
  • 个体户开票超过10万怎么交税
  • 小规模纳税人工资薪金怎么申报
  • 工程咨询属于什么服务业
  • 为什么实收资本是贷方
  • 计算业务招待费扣除限额的基础包括营业外收入
  • 以前年度多缴纳房产税,可以递延次年度使用么
  • 普票不能抵扣为什么有税率
  • 计提工资时个税怎么处理
  • 未达起征点怎么报税
  • 总账和明细账的保管期限
  • win10选择软件打开方式
  • win10rs2是哪个版本
  • ubuntu rar压缩
  • centos搭建lamp环境
  • win7无法登录qq
  • winxp系统怎么设置默认账户登入
  • CentOS安装scp命令详解
  • linux 使用技巧
  • windows7开机显示错误恢复进不去
  • win8宽带错误651最简单解决方法
  • 复制到文件夹怎么弄
  • shell命令读取文件并新增另一文件到指定行
  • js 不用var
  • 服务业增值税率6% 购进13%手机怎么抵扣
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设