前端技术

TypeScript 学习笔记

特性

JavaScript 是一门非常灵活的编程语言

  1. 它没有类型约束,一个变量可能初始化时是字符串,过一会儿又被赋值为数字。
  2. 由于隐式类型转换的存在,有的变量的类型很难在运行前就确定。
  3. 基于原型的面向对象编程,使得原型上的属性或方法可以在运行时被修改。
  4. 函数是 JavaScript 中的一等公民,可以赋值给变量,也可以当作参数或返回值。

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

而 TypeScript 的类型系统,在很大程度上弥补了 JavaScript 的缺点。

TypeScript 是静态类型

从 TypeScript 的名字就可以看出来,「类型」是其最核心的特性

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

动态类型是指在运行时才会进行类型检查,这种语言的类型错误往往会导致运行时错误。JavaScript 是一门解释型语言[4],没有编译阶段,所以它是动态类型,以下这段代码在运行时才会报错:

let foo = 1;
foo.split(' ');
// Uncaught TypeError: foo.split is not a function
// 运行时会报错(foo.split 不是一个函数),造成线上 bug

    静态类型是指编译阶段就能确定每个变量的类型,这种语言的类型错误往往会导致语法错误。TypeScript 在运行前需要先编译为 JavaScript,而在编译阶段就会进行类型检查,所以 TypeScript 是静态类型,这段 TypeScript 代码在编译阶段就会报错了:

    let foo = 1;
    foo.split(' ');
    // Property 'split' does not exist on type 'number'.
    // 编译时会报错(数字没有 split 方法),无法通过编译

    你可能会奇怪,这段 TypeScript 代码看上去和 JavaScript 没有什么区别呀。

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

    完整的 TypeScript 代码是这样的:

    let foo: number = 1;
    foo.split(' ');
    // Property 'split' does not exist on type 'number'.
    // 编译时会报错(数字没有 split 方法),无法通过编译

    TypeScript 是弱类型

    类型系统按照「是否允许隐式类型转换」来分类,可以分为强类型和弱类型。

    以下这段代码不管是在 JavaScript 中还是在 TypeScript 中都是可以正常运行的,运行时数字 1 会被隐式类型转换为字符串 ‘1’,加号 + 被识别为字符串拼接,所以打印出结果是字符串 ’11’。

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

    TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性,所以它们都是弱类型。

    什么是 TypeScript

    • TypeScript 是添加了类型系统的 JavaScript,适用于任何规模的项目。
    • TypeScript 是一门静态类型、弱类型的语言。
    • TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性。
    • TypeScript 可以编译为 JavaScript,然后运行在浏览器、Node.js 等任何能运行 JavaScript 的环境中。
    • TypeScript 拥有很多编译选项,类型检查的严格程度由你决定。
    • TypeScript 可以和 JavaScript 共存,这意味着 JavaScript 项目能够渐进式的迁移到 TypeScript。
    • TypeScript 增强了编辑器(IDE)的功能,提供了代码补全、接口提示、跳转到定义、代码重构等能力。
    • TypeScript 拥有活跃的社区,大多数常用的第三方库都提供了类型声明。
    • TypeScript 与标准同步发展,符合最新的 ECMAScript 标准(stage 3)。

    安装 TypeScript

    TypeScript 的命令行工具安装方法如下:

    npm install -g typescript

    以上命令会在全局环境下安装 tsc 命令,安装完成之后,我们就可以在任何地方执行 tsc 命令了。

    编译一个 TypeScript 文件很简单:

    tsc hello.ts

    我们约定使用 TypeScript 编写的文件以 .ts 为后缀,用 TypeScript 编写 React 时,以 .tsx 为后缀。

    Hello TypeScript

    将以下代码复制到 hello.ts 中:

    function sayHello(person: string) {
        return 'Hello, ' + person;
    }
    
    let user = 'Tom';
    console.log(sayHello(user));

    然后执行

    tsc hello.ts

    这时候会生成一个编译好的文件 hello.js

    function sayHello(person) {
        return 'Hello, ' + person;
    }
    var user = 'Tom';
    console.log(sayHello(user));

    参考链接

    bilibili 视频教程: https://www.bilibili.com/video/BV1wY411D79Z/

    笔记: http://ts.xcatliu.com/introduction/

    内容目录

    PUJI Design 朴及设计 (c) 2024. 沪ICP备17052229号