TypeScript快速入门:30分钟上手指南

韩娜☆
2025-12-19 05:49
阅读 2066

上周五晚上11点,办公室只剩我一个人。耳机里放着Lo-fi Beats,屏幕上是第17次刷新后依然报错的控制台——Cannot read property 'name' of undefined。我盯着这行熟悉的错误,脑子里却在想:要是早两个月把TypeScript用起来,哪至于被这个空指针坑到加班?

没错,我就是那个在组里干了快两年、重度依赖Cursor写代码的“AI码农”。自从公司去年推全栈TypeScript化,我从一开始抗拒(“JS不香吗?加个类型能解决啥?”),到现在写点小脚本都下意识 tsc --init,中间踩过的坑、熬过的夜、被产品经理追着问“为什么改个字段要两小时”……今天就借这篇文,给还在观望TypeScript的兄弟们来个30分钟实战速通。别怕,真的不难,而且——真香


为什么是我?一个被Bug逼疯的前端

先说背景:我在一家电商中台团队,负责商品详情页和购物车模块。去年双11前两周,线上突然崩了——因为后端改了个接口字段,从 product_name 变成 productName,而我们前端没做任何校验。测试没测出来(人家只测主流程),运维甩锅日志不全,最后是我硬生生在凌晨三点用 console.log(JSON.stringify(data)) 找出来的。

那一刻我悟了:动态语言的自由,代价是生产事故

领导看我黑眼圈都快掉到键盘上了,丢过来一句话:“下周起,新项目全上TS。” 我心里一万个MMP,但转头打开VS Code,默默装上了TypeScript插件。

结果?一个月后,我成了组里TS吹。现在连写个内部工具脚本都带类型,同事笑我“走火入魔”,但再也没人半夜打电话说“页面白屏了”。


别被吓到:TS不是新语言,是JS的超集

很多人一听TypeScript就慌,以为要学一门新语言。其实你只需要记住一点:所有合法的JavaScript代码,都是合法的TypeScript代码

什么意思?你现在手里的 .js 文件,直接改成 .ts,90%的情况能直接跑(剩下的10%可能是用了些非常规语法,比如 evalwith,但谁还写这些啊?)。

TS干的事,就是在JS基础上加了一层静态类型检查。开发时帮你揪出潜在错误,打包时又把这些类型信息全擦掉,最终输出干净的JS——所以对浏览器完全透明,不存在兼容性问题。

工具链?现在比泡面还简单

以前配TS环境能劝退一批人,现在?一行命令搞定:

# 初始化一个TS项目(假设你已有package.json)
npm install -D typescript @types/node

# 生成tsconfig.json
npx tsc --init

然后你的项目根目录就多了一个 tsconfig.json。别被它吓到,90%的配置你根本不用动。我自己的 tsconfig.json 核心就这几行:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "outDir": "./dist"
  },
  "include": ["src/**/*"]
}

重点看 strict: true —— 这是TS的“灵魂开关”。开启后,TS会强制你处理所有可能的 undefinednull,不允许隐式 any。刚开始可能会报一堆错,但相信我,这些错都是在替你挡未来的坑


实战!从零写一个带类型的购物车

光说不练假把式。咱们直接上手:用TS写一个简化版购物车逻辑,包含添加商品、计算总价、清空等功能。

第一步:定义你的“世界”

在JS里,你可能直接 const cart = [] 开干。但在TS里,先定义结构,再写逻辑

// types.ts
interface Product {
  id: number;
  name: string;
  price: number; // 单位:分
  stock: number; // 库存
}

interface CartItem {
  product: Product;
  quantity: number; // 购买数量
}

看到没?interface 就是你的契约。以后任何地方用到商品或购物车项,TS都会按这个规则检查。

💡 开发心得:别小看这一步。上周产品改需求,说要加“限购数量”字段,我只需要在 Product 里加一行 limit?: number(问号表示可选),然后TS自动标红所有没处理这个字段的地方——10分钟搞定,测试都没找我茬。

第二步:实现核心逻辑(带类型保护)

// cart.ts
import { Product, CartItem } from './types';

class ShoppingCart {
  private items: CartItem[] = [];

  addItem(product: Product, quantity: number): void {
    // 类型检查:quantity 必须是正整数
    if (quantity <= 0) {
      throw new Error('Quantity must be positive');
    }
    
    // 检查库存
    if (quantity > product.stock) {
      throw new Error(`Not enough stock for ${product.name}`);
    }

    // 查找是否已存在该商品
    const existingItem = this.items.find(item => item.product.id === product.id);
    
    if (existingItem) {
      existingItem.quantity += quantity;
    } else {
      this.items.push({ product, quantity });
    }
  }

  getTotalPrice(): number {
    return this.items.reduce((total, item) => {
      // TS知道item.product.price是number,不会undefined
      return total + item.product.price * item.quantity;
    }, 0);
  }

  clear(): void {
    this.items = [];
  }

  getItems(): CartItem[] {
    // 返回副本,防止外部直接修改内部状态
    return [...this.items];
  }
}

重点看 getTotalPrice() —— 在JS里,如果 item.productundefined,这里就会崩。但在TS里,只要编译通过,运行时就不可能出现这种错误(前提是你的类型定义准确)。

第三步:处理异步和API(真实场景)

实际项目中,商品数据来自API。这时候怎么保证类型安全?

// api.ts
import { Product } from './types';

// 使用泛型 fetch,自动推断返回类型
async function fetchProducts(): Promise<Product[]> {
  const response = await fetch('/api/products');
  if (!response.ok) {
    throw new Error('Failed to fetch products');
  }
  return response.json(); // TS知道这里返回 Product[]
}

// 使用示例
async function loadCart() {
  try {
    const products = await fetchProducts();
    const cart = new ShoppingCart();
    
    // 如果这里传了非Product对象,TS直接报错
    cart.addItem(products[0], 2); 
    
    console.log('Total:', cart.getTotalPrice());
  } catch (error) {
    // TS知道error是Error类型(因为上面throw的是Error)
    console.error('Cart error:', error.message);
  }
}

🤯 真实踩坑:有次后端改了API,把 price 字段从数字变成字符串 "199"。JS里可能只是显示异常,但TS在编译阶段就报错:Type 'string' is not assignable to type 'number'。我直接拿着报错截图去找后端:“你这接口不符合契约啊!” —— 对方秒改,再也不敢乱改字段类型。


那些让我少掉100根头发的TS技巧

1. strictNullChecks 是你的保命符

默认开启 strict 就包含了这个。它强制你处理所有可能为 null/undefined 的值。

// 错误写法(JS常见)
function getName(user) {
  return user.profile.name; // 如果user或profile是null?boom!
}

// TS写法
function getName(user: { profile?: { name: string } }): string | null {
  // 方式1:显式检查
  if (user.profile && user.profile.name) {
    return user.profile.name;
  }
  return null;

  // 方式2:用可选链(ES2020+)
  return user.profile?.name ?? null;
}

2. 用 as const 锁定字面量类型

前端常遇到枚举场景:

// 不好的方式
const STATUS = {
  PENDING: 'pending',
  SUCCESS: 'success',
  ERROR: 'error'
};

// TS会推断STATUS.PENDING是string类型,太宽泛

// 正确方式
const STATUS = {
  PENDING: 'pending',
  SUCCESS: 'success',
  ERROR: 'error'
} as const;

// 现在STATUS.PENDING的类型是字面量'pending',不能赋值给其他字符串
type Status = typeof STATUS[keyof typeof STATUS]; // 'pending' | 'success' | 'error'

3. 别滥用 any!用 unknown + 类型守卫

看到 any 就像看到裸奔的代码——危险!

// 反面教材
const data: any = JSON.parse(someString);
console.log(data.name); // 可能崩溃

// 正确姿势
function isValidUser(obj: unknown): obj is { name: string; age: number } {
  return (
    typeof obj === 'object' &&
    obj !== null &&
    'name' in obj &&
    typeof (obj as any).name === 'string' &&
    'age' in obj &&
    typeof (obj as any).age === 'number'
  );
}

const data = JSON.parse(someString);
if (isValidUser(data)) {
  console.log(data.name); // 安全!
}

工具链:让TS飞起来

除了基础编译,这些工具能极大提升体验:

工具 作用 我的使用场景
VS Code + TS插件 实时类型检查、智能提示 写代码时自动提示属性,重构时自动更新引用
ts-node 直接运行TS文件(无需编译) 写Node脚本、测试用例
typescript-eslint 在ESLint中集成TS规则 团队统一代码规范,禁止any
Cursor AI辅助写TS(我的命根子) 输入注释自动生成带类型的函数,解释复杂错误

特别提一嘴 Cursor —— 上周我遇到个嵌套泛型报错,自己看了半小时没懂。直接高亮代码问Cursor:“这TS错误啥意思?”,它不仅解释清楚,还给出了三种修复方案。那一刻我感觉:AI不是取代程序员,是帮程序员少加班


性能与兼容性?别担心

有人问:“加了类型检查,会不会影响运行性能?”

完全不会!TS只在开发阶段做检查,最终打包出来的JS和手写的一模一样。Webpack/Rollup/Vite 都有完善的TS支持,配置一行 ts-loader@vitejs/plugin-typescript 即可。

浏览器兼容性?因为输出的是标准JS,所以只取决于你 tsconfig.json 里的 target 设置。比如设为 ES5,就能兼容IE(虽然现在谁还管IE...)。


最后:30分钟够吗?

老实说,30分钟只能让你跑通第一个TS程序。但如果你:

  • 已经会JS
  • 用过现代构建工具(Webpack/Vite等)
  • 愿意接受“先花时间定义类型,后省时间debug”的理念

那么30分钟足够你爱上TypeScript

从我自己的经历看:前两天可能觉得啰嗦(“为啥要写这么多类型?”),但一周后你会开始主动设计接口;一个月后,看到别人的JS代码会本能地想:“这里应该加个类型检查...”。

上周产品又来提需求:“加个会员等级折扣”。我打开TS文件,加个 memberLevel?: 'gold' | 'silver',然后所有用到用户信息的地方自动标红。20分钟改完,提交,走人——这才是程序员该有的生活

所以,别犹豫了。打开终端,敲下 npx create-react-app my-app --template typescript(或者你的框架对应命令),开始你的TS之旅吧。

P.S. 如果卡在某个报错,别死磕。直接把错误贴给Cursor,它比Stack Overflow回得快多了 😉

评论 0

最热最新
暂无评论
韩娜☆Lv.1
0
影响力
0
文章
0
粉丝