【个人学习||ts】

学习地图

1. TypeScript 是干什么的

TypeScript,简称 TS,本质上是 JavaScript 的超集。你可以把它理解成:

  • JavaScript 负责"运行"
  • TypeScript 负责"在运行前帮你发现问题"

它最核心的能力不是让代码"更高级",而是让代码在变大、变多人协作、变复杂之后,依然能维护、能重构、能少出错。

一句话理解:

TypeScript = 给 JavaScript 增加类型系统、编辑器智能提示、重构能力和更强的工程可维护性。

2. 它解决什么问题

JavaScript 很灵活,但灵活过头时,问题也会很多:

  • 变量本来应该是数字,结果传成了字符串
  • 函数本来要 { name, age },结果只传了 { name }
  • 接口返回的数据字段拼错了,运行时才报错
  • 项目大了以后,不知道一个函数到底该接收什么、返回什么
  • 重构改名时,怕改漏

TypeScript 主要解决的是这几类问题:

  • 提前发现错误:在编码阶段或编译阶段,而不是上线后
  • 让代码可读:参数、返回值、对象结构更清晰
  • 让协作更稳定:团队成员更容易理解代码契约
  • 让重构更安全:IDE 和类型系统能帮你发现影响范围

3. 它和哪些相关技术有关系

TS 不是孤立存在的,它和下面这些技术强相关:

技术 和 TS 的关系
JavaScript TS 是 JS 的超集,最终通常会编译成 JS
Node.js TS 常用于 Node 后端、脚本、工具链开发
浏览器 浏览器不能直接执行 TS,通常要先编译成 JS
npm/pnpm/yarn 用来安装 TS 和工程依赖
Babel / tsc / SWC / esbuild 负责把 TS 转成 JS,或参与构建流程
React / Vue / Angular TS 在前端框架中非常常见
ESLint / Prettier 配合 TS 做代码规范和质量控制
tsconfig.json TS 项目的核心配置文件
类型声明文件 .d.ts 用来描述库的类型信息

4. 学它之前需要哪些前置知识

必须有的前置知识:

  • 基础 JavaScript 语法
  • 变量、函数、对象、数组、条件、循环
  • 模块化基础:import、export
  • 命令行基础:会执行 node、npm、npx

最好有,但没有也可以边学边补:

  • Node.js 基础
  • ES6+ 常用语法
  • 一个编辑器环境,比如 VS Code

如果你 JS 还很弱,不用等"学完 JS 再学 TS",可以边学边补,但至少要看得懂基础 JS 代码。

5. 真正重要的 20% 核心内容是什么

这是 TS 最值得优先拿下的主干,也是最有实战价值的 20%:

  • 基本类型:string、number、boolean、null、undefined
  • 类型推断:什么时候可以不手写类型
  • 对象类型、数组类型、函数类型
  • 接口 interface 和类型别名 type
  • 联合类型、字面量类型、可选属性
  • 泛型的基本使用
  • 类型缩小:typeof、in、判空、分支判断
  • any、unknown、never 的区别
  • 模块系统和类型声明
  • tsconfig.json 的核心配置
  • 常见报错的阅读与排查

必须吃透:

  • TS 只在开发阶段做类型检查,运行时没有类型系统
  • TS 的很多能力来自"静态分析",不是魔法
  • 好的 TS 不是"写满类型",而是"写出清晰可靠的类型边界"

6. 哪些内容是初学者容易陷入、但不值得一开始深挖的

先知道,后深入:

  • 特别复杂的条件类型
  • 高级类型体操
  • 过度追求 100% 完美类型推导
  • 大量研究编译器源码
  • 冷门配置项的全部细节
  • 很复杂的声明文件手写技巧
  • 装饰器的历史演变和提案细节

初学者最容易学偏的地方:

  • 只记语法,不理解"为什么要做静态类型约束"
  • 把 TS 学成"给每个变量强行标注类型"
  • 过度使用 any
  • 只会写,不会看报错
  • 不理解 TS 和 JS/Node/构建工具之间的关系

7. 学习本质

学 TypeScript 的本质,不是背语法,而是建立这三个能力:

  • 用类型描述数据结构和函数契约
  • 用类型系统约束错误流入系统
  • 用工程配置把"可维护性"落地

如果你最终能做到这三点,TS 就学对了。

8. 设计哲学

TypeScript 的设计哲学可以概括为三句话:

  • 尽量兼容 JavaScript,而不是推翻 JavaScript
  • 在开发阶段尽早暴露错误,而不是在运行时赌运气
  • 类型系统服务于工程实践,而不是服务于炫技

学习顺序

推荐按下面的顺序学,这是对初学者最稳、对面试也最有效的路径:

  1. 入门认知:TS 是什么、为什么存在、怎么运行第一段代码
  2. 基础类型:原始类型、数组、对象、函数、类型推断
  3. 类型建模:interface、type、可选属性、只读属性、联合类型
  4. 类型收窄:分支判断、判空、typeof、in、类型保护
  5. 泛型:泛型函数、泛型接口、泛型约束
  6. 工程配置:tsconfig.json、模块系统、编译目标、严格模式
  7. 实战协作:第三方库类型、.d.ts、Node 项目与前端项目中的 TS
  8. 常见报错与排错:类型不兼容、模块找不到、声明缺失、配置冲突
  9. 面试强化:高频问题、手写题、项目表达
  10. 进阶扩展:条件类型、映射类型、工具类型、装饰器、编译流程

正确学习顺序的方法论:

  • 第一遍先抓主干,不追求全
  • 第二遍把"为什么这样设计"补上
  • 第三遍通过项目把知识连起来
  • 第四遍用面试题反查薄弱点

企业里通常怎么用 TS:

  • 前端项目:React + TS / Vue + TS
  • Node 服务端:Express / NestJS / Fastify + TS
  • 脚本工具:构建脚本、CLI、小型自动化
  • SDK 和公共库:用 TS 定义清晰的 API 契约

必须掌握:

  • 类型基础
  • 函数和对象类型
  • interface 与 type
  • 泛型基础
  • tsconfig.json
  • 常见报错排查

知道即可:

  • 很高级的类型运算
  • 编译器内部实现细节
  • 极端复杂的声明文件设计

第一阶段:入门认知

这一阶段的目标不是"学会所有语法",而是先把这三个问题吃透:

  • TS 到底是什么
  • 为什么前端和后端项目都在用它
  • 它是怎么从 .ts 变成可运行 .js 的

1. 学什么

这一节学习:

  • TS 和 JS 的关系
  • TS 出现的原因
  • TS 的基本工作方式
  • 第一个最小 TS 程序如何运行
  • tsc、node、ts-node 分别是什么

这一节的定位是"建立方向感"。你只要把方向感建立起来,后面学类型才不会乱。

2. 为什么重要

如果第一阶段没学明白,后面很容易出现三个典型问题:

  • 把 TS 误以为是另一门完全不同的语言
  • 不知道为什么代码能运行,却报类型错误
  • 不理解"编译错误"和"运行错误"的区别

为什么它重要:

  • 它决定你后面看待 TS 的视角
  • 它决定你能不能快速理解工程里的构建链路
  • 它决定你遇到报错时,知道去查"类型层"还是"运行层"

3. 核心概念

3.1 直觉类比

可以把 JS 和 TS 理解成:

  • JavaScript:已经煮好的菜,直接能吃
  • TypeScript:菜谱加检查表,先检查食材、步骤、份量,再做成菜

真正运行的是"菜",也就是 JS。

TS 更像一套"做菜前的校验系统"。

3.2 技术定义

  • TypeScript:JavaScript 的超集,增加了静态类型系统
  • 静态类型检查:在代码运行前,根据类型规则分析代码是否可能出错
  • 编译:把 .ts 转成 .js
  • 类型注解:手动声明变量、参数、返回值的类型
  • 类型推断:TS 根据上下文自动推导出类型

3.3 易混淆概念对比

概念 本质 发生时机
JavaScript 真正运行的代码 运行时
TypeScript 带类型信息的开发代码 开发时、编译时
tsc TypeScript 官方编译器 编译时
Node.js JS 运行环境 运行时
类型错误 类型系统认为不安全 编译时或编辑器中
运行错误 程序执行真的失败 运行时

3.4 这一节解决什么实际问题

这一节要解决的是:

  • 为什么要学 TS,而不是只学 JS
  • 为什么浏览器和 Node 不能直接理解 TS
  • 为什么有些错误能提前发现

4. 原理解释

4.1 工作流程或运行机制

TypeScript 最常见的工作流程:

  1. 你编写 .ts 文件
  2. TypeScript 编译器读取代码和 tsconfig.json
  3. 编译器先做类型检查
  4. 如果配置允许,再把 TS 转成 JS
  5. Node 或浏览器执行生成后的 JS

这说明一个关键事实:

TypeScript 不直接执行,它通常先变成 JavaScript,再执行。

4.2 底层原理或设计思想

为什么 TS 不是"运行时类型系统"?

因为 JavaScript 生态太大了,TS 选择了一条更现实的路:

  • 尽量不破坏 JS 的运行方式
  • 把价值放在开发阶段
  • 用静态分析提升质量

这就是它设计得非常成功的原因:

  • 它能无缝接入 JS 项目
  • 学习成本相对低
  • 工程收益很高

4.3 一个关键认知

必须吃透:

TypeScript 的类型在绝大多数情况下只存在于编译阶段,编译成 JS 后,类型信息通常不会保留。

所以:

  • TS 能帮你提前发现很多错误
  • 但不能替代运行时校验

举例:

  • 用户从接口传来的是脏数据
  • 你即使写了 TS 类型,也不能保证运行时数据一定真的符合

这也是为什么真实项目里常常还会搭配:

  • 参数校验
  • 接口校验
  • 数据清洗

5. 示例

5.1 最小可运行示例

创建一个文件 hello.ts:

ts 复制代码
const userName: string = "Zhang";
const age: number = 20;

function introduce(name: string, userAge: number): string {
  return `我叫 ${name},今年 ${userAge} 岁`;
}

console.log(introduce(userName, age));

如果你把 age 改成:

ts 复制代码
const age: string = "20";

再调用:

ts 复制代码
console.log(introduce(userName, age));

TS 会在运行前提醒你:函数需要 number,你却传了 string。

5.2 最小操作步骤

bash 复制代码
npm init -y
npm install -D typescript ts-node @types/node
npx tsc --init

然后运行:

bash 复制代码
npx ts-node hello.ts

或者先编译再运行:

bash 复制代码
npx tsc hello.ts
node hello.js

5.3 这段示例说明了什么

  • TS 可以描述变量和函数契约
  • 类型错误会在运行前暴露
  • 真正执行的仍然是 JS 代码

6. 工程实践

6.1 真实工程场景

场景:你在做一个用户系统页面,要调用后端接口拿到用户信息。

后端预期返回:

ts 复制代码
type User = {
  id: number;
  name: string;
  isVip: boolean;
};

你在页面里写:

ts 复制代码
function showUser(user: User) {
  console.log(user.name.toUpperCase());
}

如果有人误把接口返回当成:

ts 复制代码
const user = {
  id: "1",
  username: "Tom"
};

TS 能很快提醒你:

  • id 类型不对
  • 缺少 name
  • 没有 isVip

这就是工程价值:

  • 问题在开发阶段暴露
  • 错误在"边界"被拦住
  • 后续重构更安全

6.2 明确操作步骤

第一阶段你只需要会完成下面这套动作:

  1. 安装 Node.js
  2. 初始化一个 npm 项目
  3. 安装 typescript
  4. 生成 tsconfig.json
  5. 写一个 .ts 文件
  6. 用 ts-node 直接运行,或者用 tsc 编译后运行
  7. 看懂最基础的类型报错

6.3 企业里通常怎么做

企业中一般不会手工一个个编译文件,而是放到工程脚本里:

json 复制代码
{
  "scripts": {
    "dev": "ts-node src/index.ts",
    "build": "tsc",
    "start": "node dist/index.js"
  }
}

后面你会逐步理解:

  • 开发阶段怎么跑
  • 构建阶段怎么编译
  • 生产环境怎么运行

7. 常见误区

误区 1:TS 会直接在浏览器里运行

不对。

通常浏览器执行的是编译后的 JS,不是原始 TS。

误区 2:用了 TS 就不会有运行时错误

不对。

TS 主要防"写代码时就能看出来的问题",对外部脏数据、网络异常、空值等运行时问题,仍然需要校验和防御。

误区 3:TS 就是给每个地方都写类型

不对。

TS 很多时候能自动推断类型。好代码不是"标注最多",而是"边界最清晰"。

误区 4:JS 学得一般,不能学 TS

不完全对。

只要你有基础 JS,就完全可以边学 TS 边补 JS。真正困难的往往不是语法,而是对数据结构和函数契约的理解。

误区 5:只要不报错,类型就一定设计得好

不对。

有些代码虽然"不报错",但你可能用了大量 any,这等于把 TS 的价值直接关掉了。

8. 面试题

高频面试题

  1. TypeScript 和 JavaScript 的关系是什么?
  2. 为什么说 TypeScript 是 JavaScript 的超集?
  3. TypeScript 是如何运行的?
  4. tsc、node、ts-node 分别是什么?
  5. TypeScript 能不能避免所有运行时错误?
  6. 为什么很多大型项目更偏向使用 TypeScript?
  7. TypeScript 的核心价值是语法增强,还是工程可维护性?为什么?

面试回答方向

回答这类题,建议按这个顺序说:

  1. 先定义:TS 是 JS 的超集,增加静态类型系统
  2. 再说目的:提前发现错误、提升可维护性
  3. 再说机制:编译检查后转成 JS,再由运行环境执行
  4. 最后说边界:TS 不能替代运行时校验

9. 自测题

概念自测

  1. 为什么说 TypeScript 最终通常还是要转成 JavaScript 才能运行?
  2. 什么是静态类型检查?
  3. 为什么 TS 在大型项目里比纯 JS 更有优势?
  4. 类型错误和运行错误有什么区别?
  5. tsc 和 node 各自负责什么?

动手自测

  1. 自己创建一个 hello.ts
  2. 写一个带参数和返回值类型的函数
  3. 故意传错参数类型,观察报错
  4. 分别尝试:
    npx ts-node hello.ts
    npx tsc hello.ts
    node hello.js
  5. 用自己的话写出 TS 的执行链路

第一阶段练习题

练习 1:判断题
  1. TypeScript 可以脱离 JavaScript 单独存在。
  2. Node.js 可以原生直接执行所有 .ts 文件。
  3. TypeScript 的主要价值之一是提前发现类型问题。
  4. 使用 TypeScript 后,就不需要做接口参数校验了。
练习 2:填空题
  1. TypeScript 是 JavaScript 的 ______。
  2. .ts 文件通常要先经过 ______,再交给运行环境执行。
  3. 真正负责运行 JavaScript 代码的环境可以是浏览器或 ______。
练习 3:简答题
  1. 用你自己的话解释:为什么大型项目更需要 TypeScript?
  2. 解释:为什么说 TS 的类型系统主要发生在开发阶段,而不是运行阶段?
  3. 说出 tsc、ts-node、node 的区别。
练习 4:实操作业

请你独立完成下面任务:

  1. 创建一个 hello.ts
  2. 声明两个变量:姓名和年龄,并写上类型
  3. 写一个 introduce 函数,接收姓名和年龄,返回一段介绍语
  4. 正常运行一次
  5. 故意把年龄改成字符串,再观察报错
  6. 用一句话总结这次实验说明了什么

10. 学完标志

学完这一节后,你应该能做到:

  • 能清楚解释 TS 是什么,不再把它当成"另一门完全陌生的语言"
  • 能解释 TS 为什么在工程上有价值
  • 能说清 TS、JS、Node、tsc、ts-node 之间的关系
  • 能独立跑通一个最小 TS 示例
  • 能区分"编译期类型错误"和"运行期错误"
  • 能回答基础面试题:TS 为什么存在,它解决了什么问题

如果你还做不到下面这三件事,说明第一阶段还没真正学会:

  • 用自己的话讲明白 TS 的执行流程
  • 自己搭一个最小 TS 运行环境
  • 故意制造一个类型错误并解释它为什么报错

下一阶段预告,不在这一轮展开:

  • 基础类型系统
  • 类型推断
  • 对象、数组、函数类型
  • any、unknown、never

当前阶段先把"方向感"和"第一段代码跑通"打牢,这一步非常关键。

相关推荐
阳光九叶草LXGZXJ8 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
mlidongfeng11 小时前
【学习】mKernel 分析
学习
一只小小的芙厨12 小时前
【线性DP】
学习·算法·动态规划
li星野13 小时前
DO — Auxiliary Verb (One-Page Notes)
学习
minglie113 小时前
关系的有向管道模型
学习
~kiss~14 小时前
LangChain 基础学习
学习·langchain
一木 之林14 小时前
提示词工程学习总结:用 Few-shot 把大模型调教成金融文本分类、抽取与匹配的自动化流水线
人工智能·学习·计算机视觉·金融·分类
传奇开心果编程15 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
我命由我1234516 小时前
Photoshop - Photoshop 使用对齐功能定位元素
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·学习方法
阳光九叶草LXGZXJ17 小时前
达梦数据库-报错-16-MERGE INTO提示:无效的列名[XX]
linux·运维·数据库·sql·学习