类型系统-前端发展的里程碑

简介: 继Angular2发布之后,TypeScript近日也发布了2.0版本,这不禁让我浮想一番。如果要说TS和JS最明显的差别,一定是Type System了,所以今天我们就聊聊类型系统在前端发展历程中,到底扮演了怎样的角色。 ## 历史斗争 如果要你把PV上百万级别的Web Application用一门在10天内撸出来的编程语言来开发,我想你肯定不会放心的。然而事实上我们现在都是这样干的,J

继Angular2发布之后,TypeScript近日也发布了2.0版本,这不禁让我浮想一番。如果要说TS和JS最明显的差别,一定是Type System了,所以今天我们就聊聊类型系统在前端发展历程中,到底扮演了怎样的角色。

历史斗争

如果要你把PV上百万级别的Web Application用一门在10天内撸出来的编程语言来开发,我想你肯定不会放心的。然而事实上我们现在都是这样干的,JS已经成为了最流行的编程语言。JS现在所承担的使命已经完全超出了当年设计的初衷,虽然TC39一直在填坑,并且发展到如今的ES6已经相当成熟了,但仍然留下了一些历史包袱,并不能改变这是一门动态弱类型脚本语言的实质。

因此在前端工程化不断壮大的过程中,为了避免采坑,人类同JS最佳编码实践方式展开了旷日持久的战争。

最开始,大家都只是取其精华,去其糟粕,如《JavaScript语言精粹》一书所说:你们只需要用我说的就好了,其他的垃圾都不要学,并且千万不要在项目里面用。

一般情况下每个公司都会出一套最佳实践的编码规范,程序员需要统一代码风格,按约定编写代码。但规范的约束力很低,结果在项目赶着上线的情况下还是写出了翔一样的代码,所以更好的方式是用工具来规范代码,发现一些潜在问题,通过工具来强制约定编码。比如JSLint,JSHint,以及ESLint,都是设定了一系列编码约定,让你避免写出一些糟糕的代码。

另外一种思路,就是抛弃使用JS作为开发语言,或者只是把他当成“JVM”,然后采用另外一种设计更加严谨,不容易采坑的语言来编程,比如CoffeeScript和TypeScript,开发完后再转译成JS来运行。

如果觉得这种方式过于激进,那么可以采用渐进的方式,比如Flow。Flow可以在开发时对代码进行静态类型分析,用写强类型的方式来写弱类型的JS。实质上这有很多好处:

  1. 强制声明类型,IDE和编辑器可以通过静态类型分析发现代码隐藏缺陷,同时也能够提供更强大的自动补全,智能代码提示和纠错,达到Java/C++级别的开发体验。
  2. 可避免类型隐式转换带来的消耗,提高运行效率。实际上JS引擎在运行时很大的开销都花在类型分析上。
  3. 可读性/可维护性增强。一眼就能看出这个变量是String还是Number,代码维护也更清晰,并且通过注释工具生成的代码注释也会更加详细,后面换人维护时也更容易上手。

这些优势,其实都是类型系统所带来的强类型语言所具有的开发优势,无论是在开发体验还是后期项目维护上,都要优于目前的JavaScript。

接下来,我们就以渐进的方式,来感受一下类型系统带给我们的好处。

类型系统

Flow.js

很多情况下我们都是在维护项目,不可能为了增加类型检查来修改老的项目代码。Flow可以在不修改代码的情况下,通过注释的方式来进行静态类型分析,这为我们提供了一个很好的过渡方式。你可以随时在任一个项目里面集成Flow。

/*
* @flow 
* 只需要在文件头部添加flow注释,Flow就会认为这个文件需要静态分析并检查
*/

function foo(x) {
  return x * 10;
}

// 这样调用Flow就会给出错误提示:string和number类型不兼容
foo('Hello, world!'); 

这种无侵入式的集成,可以检测出一些比较低级的错误,如果要支持更多强大的分析,就需要写侵入代码了,比如手动类型注释:

/* 
* @flow 
* var : [type] 指定变量类型
*/

function add(num1: number, num2: number): number {
  return num1 + num2;
}

// 这样调用就会报错,因为参数2已经被声明为number了
var x: number = add(3, '0');

这样的代码是不能直接运行的,还是需要Flow工具转译成原生JS才能执行。这种方式就更适合新的项目,一旦新项目直接集成了Flow套餐,就可以直接使用Flow支持的更多功能,并且配合IDE给出更好的开发体验。

以Mac下的VSC为例,首先安装本地Flow环境:

brew update
brew install flow

然后在VSC中安装启用vscode-flow插件, ⌘+' 打开用户配置,禁用VSC自带的JavaScript校验功能(设置javascript.validate.enable为 false),并设置好flow的安装目录:
图片描述

剩下的套路就跟Babel,ESLint一样了,在项目根目录下面建立一个.flowconfig文件,配置一些校验规则:
图片描述

vscode-flow插件检测到.flowconfig配置后就会启动flow服务去实时分析项目代码,当你开发的时候就能感受到比原生编辑器更加强大的自动补全和智能提示了。比如当你require一个util模块时,flow能分析出util模块内结构,并且当你调用util方法不当时给出提示:
图片描述

以上只是介绍简单流程,并且还是无侵入式的校验,如果再加上手动类型声明的话,还能提供更多功能。

TypeScript

TS的做法更彻底,如果有一个全新的项目可以自由选择技术方案的话,我一定会选TypeScript而不是Flow.js。可惜的是,在公司里面大部分时候都依赖公司自身的技术体系,在做技术选型的时候都要依赖团队的技术栈。就比如大家都用ES6,你选择TypeScript,那么之后别人来维护你的代码成本就非常高,除非你能煽动整个团队,整个集团使用:)一般情况下这是不可能的,我想这也是TS难以普及的重要原因。

但是,这并不妨碍TypeScript成为一门优雅的前端开发语言。ES6有的它都有,ES6没有他也有(泛型/枚举/类型推导等只有强类型语言才有的一些特性),而这些特性恰恰更加适合日益壮大的工程化的前端,适合编写出可维护性代码。再配合微软自家的VSC,开发体验妥妥的:
图片描述

至于TypeScript 2.0带来了哪些新特性,请直接戳GitHub:
https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript

未来趋势

前几日GitHub 发布了2016开源报告,JavaScript众望所归的荣登榜首,让众前端激动不已:
图片描述

然而让我意外的不是排在第一的JavaScript,而是最后的TypeScript:
图片描述

图片描述

看这增长趋势,微软是要协TypeScript在开源之路上越走越远了。

私认为,无论最后是不是TypeScript,类型系统都带来了更好的开发体验,代码质量,代码可读性和可维护性,这正是一个大型或长期项目所必须的,也是现在和未来的前端工程所需要的。

相关文章
|
29天前
|
监控 JavaScript 前端开发
前端的混合之路Meteor篇(六):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
本文介绍了 Meteor 3.0 中的发布-订阅模型,详细讲解了如何在服务器端通过 `Meteor.publish` 发布数据,包括简单发布和自定义发布。客户端则通过 `Meteor.subscribe` 订阅数据,并使用 MiniMongo 实现实时数据同步。此外,还展示了如何在 Vue 3 中将 MiniMongo 的 `cursor` 转化为响应式数组,实现数据的自动更新。
|
29天前
|
前端开发 安全 API
前端全栈之路Deno篇(三):一次性搞懂和学会用Deno 2.0 的权限系统详解和多种权限配置权限声明方式
本文深入解析了 Deno 2.0 的权限系统,涵盖主包和第三方包的权限控制机制,探讨了通过命令行参数、权限 API 和配置文件等多种权限授予方式,并提供了代码示例和运行指导,帮助开发者有效管理权限,提升应用安全性。
|
1月前
|
JavaScript 前端开发
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
|
2月前
|
存储 前端开发 JavaScript
前端基础(十一)_函数声明及调用、函数的形参与实参、arguments参数、函数的参数类型、函数中的问题
本文介绍了JavaScript中函数的声明及调用、形参与实参的概念、arguments对象的使用、函数参数的类型以及函数中this的作用。通过示例代码详细解释了函数如何接收参数、如何处理参数个数不匹配的情况,以及函数在不同上下文中this的指向。
25 1
|
1月前
|
前端开发 JavaScript 小程序
前端uni开发后端用PHP的圈子系统该 如何做源码?
圈子系统系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP
|
2月前
|
移动开发 缓存 前端开发
构建高效的前端路由系统:从原理到实践
在现代Web开发中,前端路由系统已成为构建单页面应用(SPA)不可或缺的核心技术之一。不同于传统服务器渲染的多页面应用,SPA通过前端路由技术实现了页面的局部刷新与无缝导航,极大地提升了用户体验。本文将深入剖析前端路由的工作原理,包括Hash模式与History模式的实现差异,并通过实战演示如何在Vue.js框架中构建一个高效、可维护的前端路由系统。我们还将探讨如何优化路由加载性能,确保应用在不同网络环境下的流畅运行。本文不仅适合前端开发者深入了解前端路由的奥秘,也为后端转前端或初学者提供了从零到一的实战指南。
|
2月前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
2月前
|
前端开发 小程序 开发者
小程序的前端 display 有什么类型?
【9月更文挑战第4天】小程序的前端 display 有什么类型?
66 4
|
2月前
|
前端开发 小程序 开发者
小程序的前端 display 有什么类型?
【9月更文挑战第1天】小程序的前端 display 有什么类型?
53 2
|
3月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
126 0

热门文章

最新文章

下一篇
无影云桌面