TypeScript 简介

typescript

TypeScript 简介

JavaScript 是一门动态类型的编程语言:它没有类型约束,一个变量可能初始化时是字符串,过一会儿又被赋值为数字。由于隐式类型转换的存在,有的变量的类型很难在运行前就确定。

这种灵活性就像一把双刃剑,一方面使得 JavaScript 蓬勃发展,无所不能;另一方面也使得它的代码质量参差不齐,维护成本高,运行时错误多。

TypeScript 是 JavaScript 的一个超集,它由 Microsoft 开发代码开源于 GitHub 上。官网对其定义为 Typed JavaScript at Any Scale(即添加了类型系统的 JavaScript,适用于任何规模的项目),TypeScript 在完整保留 JavaScript 运行时行为的基础上,通过提供了类型系统,引入静态类型系统来提高代码的可维护性,在很大程度上弥补了 JavaScript 的缺点,减少可能出现的 bug;而且 TypeScript 支持最新的 ES6 语法,因为浏览器或 Node.js 环境只能运行 JavaScript 代码,所以需要先将 TypeScript 编译为 JavaScript,类似于 Babel,TypeScript 编译器会对 ES6 语法进行转变,使得编译得到的 JavaScript 代码可以兼容旧浏览器。也正是在编译阶段对代码进行类型检查,TypeScript 提供了很多编译选项,让开发者自定义类型检查的严格程度。

TypeScript 是静态类型

类型系统按照类型检查的时机来分类,可以分为动态类型静态类型

  • 动态类型是指在运行时才会进行类型检查,这种语言的类型错误往往会导致运行时错误。JavaScript 是一门解释型语言,没有编译阶段,所以它是动态类型
    js
    let foo = 1;
    foo.split(' ');
    // Uncaught TypeError: foo.split is not a function
    // 运行时会报错(foo.split 不是一个函数),造成线上 bug
    
  • 静态类型是指编译阶段就能确定每个变量的类型,这种语言的类型错误往往会导致语法错误。TypeScript 在运行前需要先编译为 JavaScript,而在编译阶段就会进行类型检查
    ts
    let foo = 1;
    foo.split(' ');
    // Property 'split' does not exist on type 'number'.
    // 编译时会报错(数字没有 split 方法),无法通过编译
    
    Tip

    大部分 JavaScript 代码都只需要经过少量的修改(或者完全不用修改)就变成 TypeScript 代码,这得益于 TypeScript 强大的类型推论,即使不去手动声明变量 foo 的类型,也能在变量初始化时自动推论出它是一个 number 类型。


    完整的 TypeScript 代码是这样的:
    ts
    let foo: number = 1;
    foo.split(' ');
    // Property 'split' does not exist on type 'number'.
    // 编译时会报错(数字没有 split 方法),无法通过编译
    

类型系统按照是否允许隐式类型转换来分类,可以分为强类型弱类型:TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性,所以它们都是弱类型

js
console.log(1 + '1');
// 打印出字符串 '11'
Tip

作为对比,Python 是强类型(强/弱是相对的,Python 在处理整型和浮点型相加时,会将整型隐式转换为浮点型,但是这并不影响 Python 是强类型的结论,因为大部分情况下 Python 并不会进行隐式类型转换)

python
print(1 + '1')
# TypeError: unsupported operand type(s) for +: 'int' and 'str'

print(str(1) + '1')
# 打印出字符串 '11'

适用于任何规模

TypeScript 非常适用于大型项目——这是显而易见的,类型系统可以为大型项目带来更高的可维护性,以及更少的 bug。

TypeScript 还可以和 JavaScript 共存。这意味着如果你有一个使用 JavaScript 开发的旧项目,又想使用 TypeScript 的特性,那么你不需要急着把整个项目都迁移到 TypeScript,你可以使用 TypeScript 编写新文件,然后在后续更迭中逐步迁移旧文件。

另外 TypeScript 提供了一个方案,可以让你在不修改 JavaScript 文件的前提下,编写一个类型声明文件,实现旧项目的渐进式迁移。

参考资源


Copyright © 2024 Ben

Theme BlogiNote

Icons from Icônes