走进TypeScript
国内很多技术文章千篇一律,大多从官网复制粘贴,如果要学习TypeScript语法细节,去看官网最好不过了。
本文将从两个不同的角度带你走进TypeScript. 以下简称'TS'.
- 用TS有什么好处?
- 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的标准.
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的发展前景如何呢?
纵向对比
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渐渐暴露出了问题:
- 语法太灵活导致开发大型 Web 项目困难;
- 性能不能满足一些场景的需要。
微软的 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基础的小伙伴去学习,建议在线看官网,这样肯定是最新的版本。