轻松理解 TypeScript 的类型检查

48 阅读3分钟

轻松理解 TypeScript 的类型检查

一、先聊聊 JavaScript 和 TypeScript 的数据类型

咱们先来看看 JavaScript 这个老朋友的数据类型。JavaScript 有七种基本数据类型:数字(number)、字符串(string)、布尔值(boolean)、null、undefined,还有后来加入的 symbol 和 bigint。再加上对象(object)这一引用类型,这就是 JavaScript 的全部家当了。

而 TypeScript 作为 JavaScript 的超集,它不仅包含了 JavaScript 的所有数据类型,还额外带来了一些新成员。比如枚举(enum)、元组(tuple)、any、void、never 这些类型,让类型系统变得更加丰富。最棒的是,TypeScript 还能让我们自定义各种复杂的类型组合。

二、TypeScript 类型检查是怎么回事

JavaScript 的类型检查是在代码运行时进行的,这就好比是考试时才检查你有没有带笔,有点为时已晚。而 TypeScript 很聪明,它在代码编译阶段就会进行类型检查,就像老师在你交作业前先帮你检查一遍有没有错误。

举个例子,在 JavaScript 中你可以这样写:

let age = "25";
age = 25; // 完全没问题

但在 TypeScript 里:

let age: string = "25";
age = 25; // 这里就会标红提示错误

TypeScript 的类型检查就像是个贴心的助手,在你写代码时就会提醒:"嘿,这里类型可能有问题哦",而不是等到代码运行时才报错。

三、TypeScript 类型检查的写法指南

1. 基本类型标注

给变量加类型就像给它贴标签一样简单:

let name: string = "小明";
let age: number = 18;
let isStudent: boolean = true;

2. 数组和元组

普通数组这样写:

let numbers: number[] = [1, 2, 3];
// 或者
let strings: Array<string> = ["a", "b"];

元组是 TypeScript 的特色,用来表示固定长度和类型的数组:

let person: [string, number] = ["小明", 18];
// 第一个必须是字符串,第二个必须是数字

3. 对象类型

对象类型可以用接口来定义:

interface Student {
  name: string;
  age?: number; // 问号表示这个属性可选
  readonly id: number; // 只读属性
}

let xiaoming: Student = {
  name: "小明",
  id: 12345
};

4. 函数类型

函数参数和返回值都可以加类型:

function greet(name: string): string {
  return `你好,${name}`;
}

// 箭头函数写法
const add = (a: number, b: number): number => a + b;

5. 联合类型

当一个值可能是多种类型时:

let id: string | number;
id = "abc123"; // 可以
id = 123; // 也可以

6. 类型别名

给复杂类型起个简单的名字:

type UserID = string | number;
let userId: UserID = "user_123";

四、为什么要用 TypeScript 的类型检查

TypeScript 的类型检查就像是在代码里安了一个安全网,它能帮你:

  • 在写代码时就发现潜在的错误,不用等到运行时
  • 让代码更易于理解和维护,特别是团队协作时
  • 获得更好的代码提示和自动补全
  • 重构代码时更有信心,不会莫名其妙破坏现有功能

刚开始加类型可能会觉得有点麻烦,但习惯之后你会发现,这些类型标注其实是在帮你减少调试时间。就像出门前检查钥匙钱包一样,多花10秒钟,可能省下后面10分钟的麻烦。

TypeScript 的类型系统既强大又灵活,你可以根据需要选择严格的类型检查,或者在不确定的地方用 any 暂时绕过检查。最重要的是,它让我们的 JavaScript 代码变得更加可靠和可维护。