走进TypeScript

作者: 乘着风 | 来源:发表于2018-10-13 22:29 被阅读52次

    国内很多技术文章千篇一律,大多从官网复制粘贴,如果要学习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的标准.

    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的发展前景如何呢?

    纵向对比

    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的提示。
    希望本文能对你有帮助,谢谢阅读。

    参考&拓展推荐

    相关文章

      网友评论

        本文标题:走进TypeScript

        本文链接:https://www.haomeiwen.com/subject/vydaaftx.html