走进TypeScript

国内很多技术文章千篇一律,大多从官网复制粘贴,如果要学习TypeScript语法细节,去看官网最好不过了。

本文将从两个不同的角度带你走进TypeScript. 以下简称'TS'.

  1. 用TS有什么好处?
  2. TS的发展前景如何?

首先,看下TS的定义:

TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.

TypeScript是一个编译到纯JS的有类型定义的JS超集。
TS遵循当前以及未来出现的ECMAScript规范。TS不仅能兼容现有的JavaScript 代码,它也拥有兼容未来版本的JavaScript的能力。大多数TS的新增特性 都是基于未来的JavaScript提案,这意味着许多TS代码在将来很有可能会变成ECMA的标准.

走进TypeScript_第1张图片
made by 乘着风

2009年微软公司提出了TypeScript的第一个版本,是由C#之父Anders Hejlsberg 领导开发的, 了解C#的同学学起来就幸福了。

TS有什么好处?

TypeScript能从可维护性、健壮性等方面提高代码质量。

说到代码质量,大家有什么提高方法呢? 对于长期迭代的项目,开发和维护的成员会有很多,团队成员水平,风格会有差异,还具有流动性。代码层面上统一规范可以避免一些问题,比如eslint等工具,我们公司的项目就使用了jshint统一规范, 不通过编译不能上线。

常见的代码检查工具:JsHint / JsLint / EsLint
语法级别约束:使用未定义变量,括号未闭合等; 规范/风格级别约束:!= ===, 缩进,未使用的变量, parseInt(第二个参数), (兼容性)
Eslint 这些语法检查的能提前检查出来这些错误,减少了调试的成本,减少了线上bug.

但是还有不足,比如一些参数类型,个数的错误检测不到。
谨慎的程序员会做个判空处理等,来避免这样的错误。如果未处理,在复杂的线上环境中,程序就有可能会崩溃。
而TS可以帮助我们避免这些问题,从而提高代码健壮性, 因为TS是强类型的语言,下面看下它怎样约束类型的。

类型注解

let isDone: boolean = false;

变量后面跟的冒号,后面的类型就是,这个变量的类型注解。类型的注解是可选的,不加就变成了JS,因为TS设计目标就是:兼容JS,减少js迁移TS的成本。

类型 描述
Boolean 与JS相同
Number 与JS相同
String 与JS相同
Array 与JS相同; 增加了泛型数组, 元组(Tuple)
Enum enum类型是为了给一个数字集合更友好地命名
any any类型可以表示任意JavaScript值
void void就是any的对立面,即所有类型都不存在的时候。你会在一个没有返回值的函数看到它

详细用法请参考官网。

TS另外一个特点是对面向对象思想进行了增强

接口(Interface)
维基百科对OOP中接口的定义是:
在面向对象的语言中,术语interface经常被用来定义一个不包含数据和逻辑 代码但用函数签名定义了行为的抽象类型。

实现一个接口可以被看作是签署了一份协议。接口好比是协议,当我们签署(实现)它时,必须遵守它的规则。接口的规则是方法和属性的签名,我们必须实现它们。
当我们在程序设计的时候,基类中的所有方法都不用去实现,就可以使用接口来代替类,提高延展性。
格式:

interface 接口名{
      方法的声明:不需要public和其他修饰符,默认是public
}
  • 接口只能被实现,不能实例化。
  • 当类实现接口时,必须将接口当中所有的方法全部实现。
  • 接口可以多实现,在一定程度上弥补了类不能多继承的缺陷,实现多个接口,接口之间使用逗号隔开。

泛型
泛型用来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。

  • 使用泛型类型可以最大限度的重用代码,保护类型的安全
  • 降低了强制转换操作的成本或风险
  • 可以对泛型类进行约束以访问特定数据类型的方法

这里就不贴代码,详细用法请参考官网。

说了这么多,TS的发展前景如何呢?

纵向对比

走进TypeScript_第2张图片
made by 乘着风

列举几个跟它属性很相似的几位,他们都是需要编译的,编译结果都是js.

  • CoffeeScript 目的是让Js更简洁,优美,提高可读性,但没有像TS一样利用类型检测提高代码健壮性,而且自从有了ES6,CoffeeScript在业界的声音几乎消失了。
  • Dart 是2011年10月谷歌推出的新一代web编程语言,它的优势是Chrome支持,将在预版本里支持Dart. 将在V8引擎融合Dart VM虚拟机来运行 Dart 程序可以提升性能,但是一直是个提案,稳定版现在不支持,而且其他流浏览器都不支持。另外,用 Dart 开发的人很少,社群也没有什么声音,不过最近Google最近推出的了移动端解决方案Flutter(他是跟Facebook的RN,阿里的Weex一个维度的技术),被国内很多团队认可,Flutter程序需要用Dart编写的,以后可以继续关注。
  • Flow是Facebook的自家规范, 不知道大家见过没flow格式代码,Facebook开源的项目很多用Flow写的,比如React源码 -> 切换Chrome,
    RN的源码也有一些模块是Flow格式的,但是也有TS格式的。
    最新版的React Native中的官方项目已经改用Flow了。 -》切换Sublime
    TS周边生态、文档完整性、社区资源方面胜过Flow。
  • AssemblyScript呢,不是TS的对手,可以说是TS的兄弟,在接下来,我会结合TS生态和发展一起介绍。

基于TS开发的项目越来越多

  • angular2
  • ant-design
  • VSCode
  • babel7.0
  • WebAssembly
    ……

WebAssembly 与 TS

随着Web应用变得更多更复杂,js渐渐暴露出了问题:

  1. 语法太灵活导致开发大型 Web 项目困难;
  2. 性能不能满足一些场景的需要。

微软的 TypeScript 通过为 JS 加入静态类型检查来改进 JS 松散的语法,提升代码健壮性。
对于性能问题,有Google的Dart和Firefox的asm.js,二者不被其他浏览器运营商认可,且语言学习成本高。

为解决这个现状,由 Google , Microsoft , Mozilla , Apple 等几家大公司合作发起的一个关于 面向Web的通用二进制和文本格式的项目 —> WebAssembly。
WebAssembly 并不是一门编程语言,而是一份字节码标准。
可以简单把它理解为浏览器的汇编语言。

  • 字节码体积小,下载快
  • 无需解释执行
  • 底层代码无兼容性问题

四大浏览器巨头很少一起做项目的, 所以它非常被业内看好。
它跟TS有什么关系呢?上一小段有提到AssemblyScript。

目前能编译成 WebAssembly 字节码的高级语言有:
AssemblyScript, c\c++,Kotlin,Golang, Rust.

AssemblyScript语法和 TypeScript 一致,对前端来说学习成本低,为前端编写 WebAssembly 最佳选择。

总结

TypeScript是一个编译到纯JS的有类型定义的JS超集。

  • 易于js程序员学习
  • 提高代码质量
  • 发展前景好

读了这么多,何不动手尝试一下呢?TS的中文文档非常完善,另外还可在线编译->Playground. 本地调试的话,很简单,npm i typescirpt, 使用tsc命令编译就好,或者使用VScode编辑器, 自带TS的提示。
希望本文能对你有帮助,谢谢阅读。

参考&拓展推荐

  • Flow vs TS:
  • 从C#角度学习TS
  • TS编译器源码
  • WebAssembly
  • 《Learning TypeScript中文版》粗略读了一遍,有一小半介绍了es6的基础,更适合没有JS基础的小伙伴去学习,建议在线看官网,这样肯定是最新的版本。

你可能感兴趣的:(走进TypeScript)