为什么选择TypeScript?一次前端开发的真实体验

「JavaScript是动态类型语言,写起来快,但维护起来要命。」——这是我在经历了几次线上事故后得出的结论。今天聊聊为什么TypeScript值得学习。

我的JavaScript血泪史

场景一:undefined的陷阱

1
2
3
function getUserName(user) {
return user.name.toUpperCase(); // 如果user是undefined呢?
}

场景二:类型不匹配

1
2
3
4
5
function add(a, b) {
return a + b;
}

add(1, '2'); // 返回 "12",而不是 3

这些Bug在JavaScript中太常见了,而且往往在运行时才暴露。

TypeScript带来了什么

编译时类型检查

1
2
3
4
5
6
7
8
9
10
interface User {
name: string;
age: number;
}

function getUserName(user: User): string {
return user.name.toUpperCase();
}

// TypeScript会在编译时告诉你错误

智能提示

IDE能准确告诉你每个对象有哪些属性、函数有哪些参数。这是纯JavaScript做不到的。

代码即文档

1
2
3
function fetchUser(id: string): Promise<User> {
// ...
}

看这个函数签名,我就知道:

  • 输入是一个字符串类型的id
  • 返回一个Promise,resolve后是User对象

TypeScript vs JavaScript

特性 JavaScript TypeScript
类型 动态类型 可选静态类型
编译 无需编译 需要编译
学习曲线 中等
开发体验 一般
维护性

迁移成本

如果你已经有JavaScript项目,可以逐步迁移:

  1. 安装TypeScript:npm install typescript
  2. 配置文件:tsconfig.json
  3. 重命名文件:.js.ts
  4. 添加类型注解
  5. 处理类型错误

常见类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 基础类型
let name: string = 'Tom';
let age: number = 25;
let isActive: boolean = true;

// 数组
let list: number[] = [1, 2, 3];
let names: Array<string> = ['Tom', 'Jerry'];

// 接口
interface User {
id: number;
name: string;
email?: string; // 可选属性
}

// 联合类型
type Status = 'pending' | 'success' | 'error';

// 函数
type Callback = (data: string) => void;

总结

TypeScript不是银弹,但它确实让我的代码质量提升了一个档次。如果你还在犹豫,我的建议是:试试看

你可能不会喜欢它,但你应该了解它。