请写一篇关于【TypeScript快速入门:30分钟上手指南】的技术文章
开篇:凌晨三点,我删掉了所有 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 最劝退的地方,就是初学者总想把每个变量、每个函数都写得“类型完美”。结果卡在 interface 和 type 的区别上两小时,项目进度为零。
我的建议:先写 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 Types 或 Conditional 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 分钟,你只需要学会:
- 给变量加
: type - 给 React 组件定义
Props接口 - 用
interface描述你的数据结构 - 遇到报错先看错误信息,别急着用
any
剩下的,边做边学。编程不是考试,没人要求你一次写对。
我现在每天还会遇到 TS 报错,但不再焦虑了。因为我知道,每一个红色波浪线,都是在帮我提前发现一个潜在的线上 bug。这比半夜被 PagerDuty 叫醒强一万倍。
最后:技术人的体面
上家公司倒闭那天,我和几个同事在望京喝到凌晨。有人哭,有人骂老板,有人说要去送外卖。
我没说话。我只是默默把 GitHub 上所有项目都加了 TS 类型定义,然后投了新简历。
技术人的体面,不是不倒下,而是倒下后还能爬起来,带着经验继续走。
TS 教会我的,从来不是“如何写出完美类型”,而是“如何写出更可靠的代码,从而赢得多一点的选择自由”。
无论你最后决定留在大城市,还是回老家开个小店,我都希望你能像我一样:手里有技术,心里不慌。
毕竟,能写出健壮代码的人,走到哪都不会饿死。
(全文约 3680 字)

评论 0