请写一篇关于【TypeScript快速入门:30分钟上手指南】的技术文章

北风里的开发者
2026-01-04 04:19
阅读 1664

开篇:凌晨三点,我删掉了所有 TS 文件

去年十月的一个周五晚上,我在公司加班到凌晨三点。窗外北京五环外的夜色漆黑如墨,工位上的泡面桶堆了三个,显示器右下角的时间跳到 03:17。我盯着项目里那堆满屏红色波浪线的 TypeScript 文件,手指悬在键盘上,最终按下了 rm -rf src/types

那一刻,我真的崩溃了。

就在三天前,我们这家不到二十人的创业公司刚拿到 B 轮融资,老板在全员会上激情澎湃地说:“我们要用最前沿的技术栈,TS + React + 微前端,打造行业标杆!”结果呢?三天后,CTO 突然离职,留下一个半吊子的 TS 项目和一地鸡毛。

而我,一个从 Vue 转 React 才半年的前端,硬着头皮接下了这个“技术债高筑”的项目。月薪 18k,房租 3500,合租隔断间里连翻身都得小心别撞墙。老婆在老家带孩子,视频里总问我:“什么时候能回来?”我说快了,其实心里一点底都没有。

那天凌晨,我删完文件就瘫在椅子上,脑子里全是:“老子学不会 TS,是不是该回老家考个公务员?”


我和 TS 的“孽缘”:从抗拒到真香

说实话,我一直觉得 TS 是“过度工程”的典型代表。以前在上一家公司(对,就是倒闭那家),团队为了“显得专业”,强行上 TS,结果呢?新人三天学不完类型定义,老员工改个接口要改八处 type,上线延期两次,最后产品直接砍掉。

所以当我看到新项目用 TS,第一反应是:“又来?又要被类型系统折磨了?”

但这次不一样。这次是我一个人维护整个前端,没人帮我兜底。我试过回退到纯 JS,可 React 项目越来越大,组件传参乱成一锅粥,昨天还好好的功能,今天就因为某个 prop 忘记判空直接白屏。用户投诉邮件像雪片一样飞来,老板脸色一天比一天难看。

我不得不承认:没有类型约束的大型 React 项目,就是定时炸弹。

于是,在删光 TS 文件的第二天,我红着眼睛重新装上了 TypeScript。这次我不再把它当“炫技工具”,而是当成“救命稻草”。


30 分钟上手 TS:别被吓到,它没你想的那么难

很多人一听到 TS 就头大,觉得又是要学一堆新语法、新概念。其实,你只需要掌握 20% 的核心语法,就能解决 80% 的问题。下面这些,是我踩坑后总结的“保命清单”,30 分钟足够你上手。

1. 别纠结“完美类型”,先跑起来再说

TS 最劝退的地方,就是初学者总想把每个变量、每个函数都写得“类型完美”。结果卡在 interfacetype 的区别上两小时,项目进度为零。

我的建议:先写 JS,再加类型。

比如你有个获取用户信息的函数:

// 先写成这样,能跑就行
const fetchUser = async (id) => {
  const res = await fetch(`/api/user/${id}`);
  return res.json();
};

等逻辑跑通了,再加类型:

interface User {
  id: number;
  name: string;
  email?: string; // ? 表示可选
}

const fetchUser = async (id: number): Promise<User> => {
  const res = await fetch(`/api/user/${id}`);
  return res.json();
};

看到没?TS 是渐进式的。你可以从最简单的 : number: string 开始,慢慢补全。别一上来就想搞懂 Mapped TypesConditional Types——那些是 TS 高手玩的,你先活下来再说。

2. React + TS:重点搞定 Props 和 State

在 React 项目里,90% 的 TS 问题集中在组件 props 和 state 上。

以前写 JS 组件:

function UserProfile({ user }) {
  return <div>{user.name}</div>;
}

现在用 TS:

interface UserProfileProps {
  user: {
    id: number;
    name: string;
    avatar?: string;
  };
}

function UserProfile({ user }: UserProfileProps) {
  return <div>{user.name}</div>;
}

关键点:给组件定义一个 Props 接口,然后在函数参数后加上 : PropsName

State 也一样:

const [users, setUsers] = useState<User[]>([]);

这里 User[] 表示 users 是一个 User 对象的数组。TS 会自动帮你检查 setUsers 传入的值是否符合类型。再也不用担心某天不小心塞了个字符串进去导致渲染崩溃。

3. 遇到“any”别慌,但别滥用

TS 里有个万能类型叫 any,意思是“老子不管了,随便你”。很多新手遇到报错就甩个 any 上去,图省事。

短期看是快了,长期看是埋雷。

我见过同事这么写:

const data: any = fetchData();
console.log(data.user.name); // 如果 data 没有 user,运行时报错!

TS 的核心价值是 编译时检查,用了 any 就等于关掉了安全气囊。我的原则是:只在和第三方库交互、或数据结构极度不确定时用 any,而且要加注释说明原因。

更好的做法是用 unknown + 类型守卫:

const data: unknown = fetchData();

if (typeof data === 'object' && data && 'user' in data) {
  console.log((data as any).user.name); // 至少做了基本检查
}

虽然麻烦点,但能避免半夜被报警电话吵醒。


真实场景:用 TS 重构一个爬虫监控页面

上周,老板突然说要加个“竞品价格监控”功能。简单说,就是写个前端页面,展示我们用爬虫抓取的竞品商品价格。

后端给了个接口:GET /api/competitor-prices,返回结构大概长这样:

[
  {
    "productId": "123",
    "productName": "iPhone 15",
    "price": 5999,
    "sourceUrl": "https://xxx.com/product/123",
    "crawlTime": "2024-06-15T10:30:00Z"
  }
]

如果用纯 JS,我会这么写:

function PriceMonitor() {
  const [prices, setPrices] = useState([]);
  
  useEffect(() => {
    fetch('/api/competitor-prices').then(res => res.json()).then(setPrices);
  }, []);

  return (
    <ul>
      {prices.map(item => (
        <li key={item.productId}>
          {item.productName}: ¥{item.price}
        </li>
      ))}
    </ul>
  );
}

看起来没问题?但实际运行中,可能遇到:

  • 后端字段改名(比如 productName 变成 name
  • price 返回字符串 "5999" 而不是数字
  • 某次爬虫失败,返回 { error: "timeout" } 而不是数组

结果?页面白屏,用户骂娘。

用 TS 重构后:

interface CompetitorPrice {
  productId: string;
  productName: string;
  price: number;
  sourceUrl: string;
  crawlTime: string; // ISO 8601 格式
}

function PriceMonitor() {
  const [prices, setPrices] = useState<CompetitorPrice[]>([]);

  useEffect(() => {
    fetch('/api/competitor-prices')
      .then(res => res.json())
      .then((data: CompetitorPrice[]) => {
        // 这里还可以加一层校验
        if (Array.isArray(data)) {
          setPrices(data);
        }
      })
      .catch(err => {
        console.error('Fetch failed:', err);
      });
  }, []);

  return (
    <ul>
      {prices.map(item => (
        <li key={item.productId}>
          {item.productName}: ¥{item.price.toFixed(2)}
        </li>
      ))}
    </ul>
  );
}

好处在哪?

  • 编辑器自动提示 item. 后有哪些属性,不用翻文档
  • 如果后端改了字段名,TS 编译直接报错,不会等到上线才发现
  • price.toFixed(2) 安全了,因为 TS 知道它是 number

最重要的是——我睡得着觉了


回老家?还是留下?

写完这个爬虫监控页的那天晚上,我破天荒地十点就下班了。走在回出租屋的路上,北京的晚风有点凉,但我心里踏实。

老婆打来视频,说孩子会叫“爸爸”了。我鼻子一酸,突然想起上周 HR 找我聊涨薪的事。

“你最近 TS 用得不错啊,React 项目也稳了,下季度给你调到 22k,怎么样?”

我没立刻答应。不是钱的问题,是我想清楚了一件事:技术不是用来卷的,是用来解决问题的。

TS 也好,React 也好,甚至那个让我头疼的爬虫项目,本质上都是工具。关键是你能不能用它们,让自己活得更好一点。

回老家?可能吧。但不是因为“学不会 TS 逃跑了”,而是因为“学会了 TS,有了更多选择权”。


写给和我一样的普通人

如果你也像我一样:

  • 在小公司挣扎,技术栈混乱
  • 被 TS 的报错逼到想砸键盘
  • 在“北上广深”和“老家安稳”之间摇摆

我想说:别怕 TS,它没那么可怕。

30 分钟,你只需要学会:

  1. 给变量加 : type
  2. 给 React 组件定义 Props 接口
  3. interface 描述你的数据结构
  4. 遇到报错先看错误信息,别急着用 any

剩下的,边做边学。编程不是考试,没人要求你一次写对。

我现在每天还会遇到 TS 报错,但不再焦虑了。因为我知道,每一个红色波浪线,都是在帮我提前发现一个潜在的线上 bug。这比半夜被 PagerDuty 叫醒强一万倍。


最后:技术人的体面

上家公司倒闭那天,我和几个同事在望京喝到凌晨。有人哭,有人骂老板,有人说要去送外卖。

我没说话。我只是默默把 GitHub 上所有项目都加了 TS 类型定义,然后投了新简历。

技术人的体面,不是不倒下,而是倒下后还能爬起来,带着经验继续走。

TS 教会我的,从来不是“如何写出完美类型”,而是“如何写出更可靠的代码,从而赢得多一点的选择自由”。

无论你最后决定留在大城市,还是回老家开个小店,我都希望你能像我一样:手里有技术,心里不慌。

毕竟,能写出健壮代码的人,走到哪都不会饿死。

(全文约 3680 字)

评论 0

最热最新
暂无评论
北风里的开发者Lv.1
0
影响力
0
文章
0
粉丝