JavaScript vs TypeScript 对比

同样的用户问候功能,JS 和 TS 写法对比:

// JavaScript 版本
function greetUser(user) {
  return "Hello, " + user.name + "! You are " + user.age + " years old.";
}

const user = { name: "Alice", age: 25 };
console.log(greetUser(user));        // Hello, Alice! You are 25 years old.
console.log(greetUser({ name: 42 })); // 不报错,但输出结果异常:Hello, 42! You are undefined years old.
// TypeScript 版本
interface User {
  name: string;
  age: number;
}

function greetUser(user: User): string {
  return `Hello, ${user.name}! You are ${user.age} years old.`;
}

const user: User = { name: "Alice", age: 25 };
console.log(greetUser(user));         // Hello, Alice! You are 25 years old.
console.log(greetUser({ name: 42 })); // ❌ 编译错误:name 应为 string,不能传 number

TypeScript 在编写代码时就能发现类型错误,而不是等到运行时出现奇怪的 bug。


TypeScript 是微软开发的开源编程语言,是 JavaScript 的超集——所有合法的 JS 代码都是合法的 TS 代码。TypeScript 在 JS 的基础上增加了静态类型系统,最终仍需编译为 JavaScript 才能在浏览器或 Node.js 中运行。

为什么用 TypeScript

  • 静态类型检查:在编译阶段发现类型错误,而不是等到运行时
  • 更好的 IDE 支持:自动补全、重构、跳转定义
  • 可维护性:类型即文档,大型项目协作更清晰
  • 渐进迁移:可以逐步从 JS 迁移,无需一次性重写

基本类型

let num: number = 100;
let str: string = "hello";
let flag: boolean = true;
let arr: number[] = [1, 2, 3];
let tuple: [string, number] = ["Alice", 25];

// 联合类型
let id: string | number = "abc";

// 字面量类型
let direction: "left" | "right" | "up" | "down" = "left";

// any(尽量避免)
let anything: any = 42;

// unknown(比 any 更安全)
let value: unknown = "hello";

函数类型

function add(a: number, b: number): number {
  return a + b;
}

// 可选参数
function greet(name: string, age?: number): string {
  return age ? `${name}, ${age}` : name;
}

// 箭头函数
const multiply = (a: number, b: number): number => a * b;

interface 和 type

// interface:定义对象结构,支持继承和扩展
interface User {
  id: number;
  name: string;
  email?: string;  // 可选字段
}

// type:更灵活,可定义联合类型、交叉类型等
type Status = "active" | "inactive" | "pending";
type AdminUser = User & { role: "admin" };

泛型

// 泛型函数
function identity<T>(value: T): T {
  return value;
}

// 泛型接口
interface ApiResponse<T> {
  data: T;
  status: number;
  message: string;
}

// 使用
const response: ApiResponse<User[]> = {
  data: [],
  status: 200,
  message: "ok",
};

常用工具类型

interface User {
  id: number;
  name: string;
  email: string;
}

// Partial:所有字段变可选
type PartialUser = Partial<User>;

// Required:所有字段变必填
type RequiredUser = Required<User>;

// Pick:选取部分字段
type UserPreview = Pick<User, "id" | "name">;

// Omit:排除部分字段
type UserWithoutEmail = Omit<User, "email">;

// Record:构建键值对类型
type UserMap = Record<string, User>;

编译与运行

# 安装 TypeScript 编译器
npm install -g typescript

# 编译单个文件
tsc hello.ts

# 初始化项目配置
tsc --init  # 生成 tsconfig.json

# 监听模式
tsc --watch

浏览器支持现状

浏览器目前不能直接运行 TypeScript,必须先编译为 JavaScript。常用编译工具:

工具 特点
tsc 官方编译器,支持完整类型检查
SWC Rust 编写,速度极快,Next.js 内置
esbuild Go 编写,速度极快,Vite 开发模式使用
Babel 插件丰富,只转译不做类型检查

注意:SWC、esbuild、Babel 只做语法转译(剥离类型注解),不做类型检查。完整的类型检查仍需 tsc。

未来浏览器有可能通过 TC39 Type Annotations 提案(当前 Stage 1)将类型注解视为注释忽略,但不会做运行时类型检查。Node.js 23+ 已实验性支持直接执行 .ts 文件(同样忽略类型)。