TypeScript快速入门:30分钟上手指南
大家好,我是一名工作5年的后端开发工程师,平时也带不少新人。最近越来越多的前端项目开始用 TypeScript(简称 TS),连我们后端也在考虑用它写 Node.js 服务。很多零基础的同学一看到“类型”、“接口”这些词就头大,其实没那么难!我当初学的时候,也是从一个 console.log 开始的。
这篇教程就是为完全没接触过 TS 的你量身打造的。我会用最简单的语言、最贴近实战的例子,带你30分钟内真正“上手”。而且你会发现:TS 不仅能让你少犯错,还能帮你写出更清晰、更容易维护的代码——这对做 产品、搞 React 前端、甚至未来想碰 区块链 智能合约开发(比如用 TS 写 Hardhat 脚本)都特别有用。
一、TypeScript 是什么?为什么值得学?
一句话定义:TypeScript 是 JavaScript 的“超集”,意思是:所有合法的 JS 代码都是合法的 TS 代码,但 TS 多了“类型系统”。
想象一下,你写了一个函数:
function add(a, b) {
return a + b;
}
如果别人传了字符串 "1" 和数字 2,结果是 "12",而不是 3。这种 bug 很难发现,尤其在大型 产品 中。
而用 TS,你可以这样写:
function add(a: number, b: number): number {
return a + b;
}
现在,如果你传了字符串,编辑器会立刻标红警告!这就是 类型安全 的威力。
🌟 开发心得
我刚转 TS 时觉得“多此一举”,但后来在 React 项目里,因为 props 类型不匹配导致页面白屏,花了半天才定位。自从用了 TS,这类低级错误几乎绝迹。类型不是束缚,而是你的第一道测试。
二、环境准备:5 分钟搭好开发环境
别担心,不需要复杂配置!我们用最轻量的方式启动。
步骤 1:安装 Node.js
去 https://nodejs.org 下载 LTS 版(长期支持版),安装即可。
验证是否成功:
node -v # 应该输出 v18.x 或更高
npm -v # 应该有版本号
步骤 2:创建项目并安装 TypeScript
mkdir ts-demo
cd ts-demo
npm init -y
npm install -g typescript # 全局安装 tsc 编译器
💡 小技巧:
npm init -y会自动生成package.json,省去交互式提问。
步骤 3:初始化 TS 配置
tsc --init
这会生成一个 tsconfig.json 文件,这是 TS 的“说明书”。默认配置就够初学者用了。
步骤 4:写第一个 TS 文件
新建 hello.ts:
const message: string = "Hello, TypeScript!";
console.log(message);
步骤 5:编译并运行
tsc hello.ts # 生成 hello.js
node hello.js # 输出:Hello, TypeScript!
✅ 恭喜!你已经跑通了第一个 TS 程序!
三、核心概念:用例子讲清楚关键语法
1. 类型注解(Type Annotations)
告诉 TS 变量是什么类型。
let age: number = 25;
let name: string = "Alice";
let isActive: boolean = true;
let hobbies: string[] = ["coding", "reading"];
⚠️ 注意:TS 在运行时会被编译成纯 JS,所以
: number这些不会出现在最终代码里,只在开发阶段起作用。
2. 接口(Interface)——定义对象的“形状”
假设你要表示一个用户:
interface User {
id: number;
name: string;
email: string;
}
const user: User = {
id: 1,
name: "Bob",
email: "bob@example.com"
};
如果漏写 email,或者把 id 写成字符串,TS 会报错。
3. 函数类型
function greet(user: User): string {
return `Hello, ${user.name}!`;
}
// 箭头函数写法
const calculateTax = (price: number, rate: number): number => {
return price * rate;
};
4. 联合类型(Union Types)
一个变量可能是多种类型之一:
function formatId(id: string | number): string {
return `ID-${id}`;
}
formatId(123); // OK
formatId("abc"); // OK
formatId(true); // ❌ 报错!
5. 泛型(Generics)——让函数更灵活
比如写一个返回数组第一个元素的函数:
function first<T>(arr: T[]): T | undefined {
return arr[0];
}
const nums = [1, 2, 3];
const firstNum = first(nums); // 类型自动推断为 number | undefined
<T> 就是泛型,相当于“占位符”,调用时根据实际参数确定类型。
四、实战项目:用 TS 写一个区块链交易模拟器
为什么选这个?因为 区块链 开发中数据结构必须严格,TS 能极大减少错误。而且这个例子足够简单,又能覆盖核心语法。
目标
模拟一个交易系统,包含:
- 用户账户
- 发起转账
- 记录交易日志
步骤 1:定义数据结构
新建 blockchain.ts:
// 定义交易类型
interface Transaction {
from: string; // 发送方地址
to: string; // 接收方地址
amount: number; // 金额
timestamp: Date;
}
// 定义账户
interface Account {
address: string;
balance: number;
}
步骤 2:实现转账逻辑
class Blockchain {
private accounts: Map<string, Account> = new Map();
private transactions: Transaction[] = [];
// 创建账户
createAccount(address: string, initialBalance: number = 0): void {
if (this.accounts.has(address)) {
throw new Error("Account already exists");
}
this.accounts.set(address, { address, balance: initialBalance });
}
// 获取余额
getBalance(address: string): number {
const account = this.accounts.get(address);
if (!account) {
throw new Error("Account not found");
}
return account.balance;
}
// 转账
transfer(from: string, to: string, amount: number): void {
const sender = this.accounts.get(from);
const receiver = this.accounts.get(to);
if (!sender || !receiver) {
throw new Error("Account not found");
}
if (sender.balance < amount) {
throw new Error("Insufficient balance");
}
sender.balance -= amount;
receiver.balance += amount;
// 记录交易
this.transactions.push({
from,
to,
amount,
timestamp: new Date()
});
}
// 获取交易历史
getTransactions(): Transaction[] {
return [...this.transactions]; // 返回副本,防止外部修改
}
}
步骤 3:测试一下
在 index.ts 中:
import { Blockchain } from "./blockchain";
const chain = new Blockchain();
// 创建两个账户
chain.createAccount("Alice", 1000);
chain.createAccount("Bob", 500);
// 转账
chain.transfer("Alice", "Bob", 200);
console.log("Alice's balance:", chain.getBalance("Alice")); // 800
console.log("Bob's balance:", chain.getBalance("Bob")); // 700
console.log("Transactions:", chain.getTransactions());
步骤 4:编译并运行
tsc index.ts blockchain.ts
node index.js
你会看到清晰的输出,而且整个过程 类型安全 —— 如果你拼错字段名(比如 ammount),TS 会立刻提醒你。
💡 开发心得:我在做区块链工具链时,用 TS 写脚本处理合约部署,因为地址、金额等字段不能出错,TS 的类型检查救了我无数次。
五、新手常见问题解答(FAQ)
Q1:TS 和 JS 到底有什么区别?
| 对比项 | JavaScript | TypeScript |
|---|---|---|
| 类型 | 动态类型(运行时才知道) | 静态类型(写代码时就知道) |
| 错误发现时机 | 运行时才报错 | 编码时就提示 |
| 学习成本 | 低 | 略高(但回报巨大) |
| 适用场景 | 小脚本、快速原型 | 中大型项目、团队协作 |
Q2:一定要写类型注解吗?
不一定!TS 有 类型推断。比如:
let count = 42; // TS 自动推断为 number
只有在函数参数、返回值、对象结构等需要明确契约的地方才建议显式标注。
Q3:TS 能和 React 一起用吗?
当然!Create React App 默认就支持 TS。只需把 .js 改成 .tsx,就能享受:
interface Props {
title: string;
count: number;
}
const MyComponent: React.FC<Props> = ({ title, count }) => {
return <h1>{title}: {count}</h1>;
};
这样写 React 组件,props 一目了然,再也不怕传错参数!
Q4:编译后的 JS 文件怎么处理?
通常我们会:
- 用
tsc --watch实时编译 - 或者用构建工具(如 Vite、Webpack)集成 TS
- 最终部署的是
.js文件,用户无感知
六、学习建议与下一步
✅ 今日收获回顾
- 你学会了 TS 的基本语法(类型、接口、泛型)
- 你完成了一个小型区块链模拟器
- 你知道了 TS 如何提升 产品 开发质量
🔜 下一步学什么?
- 深入 React + TS:尝试用 TS 重构一个旧的 React 组件
- 学习高级类型:
typevsinterface、Partial、Pick等工具类型 - 配置优化:了解
tsconfig.json中的关键选项(如strict模式) - 工程化:结合 ESLint、Prettier 打造完美 TS 开发环境
🚫 避坑指南
- 不要追求 100% 类型覆盖:初期先覆盖关键函数和数据结构
- 遇到报错别慌:90% 的 TS 错误都是“你写错了”,不是 TS 有问题
- 善用 VS Code:安装官方 TS 插件,悬停变量就能看到推断类型
结语
TypeScript 不是洪水猛兽,而是一个 帮你减少 bug、提升代码可读性 的强大工具。无论你是要做前端 React 应用,还是后端服务,甚至是 区块链 工具开发,TS 都会让你事半功倍。
记住:类型不是为了限制你,而是为了让你更自由地重构和扩展。
现在,打开你的编辑器,新建一个 .ts 文件,写下你的第一行类型安全代码吧!
本文约 3280 字,阅读+实操刚好 30 分钟。如果你觉得有用,欢迎分享给正在挣扎的小伙伴!

评论 0