【个人学习||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 语法
  • 变量、函数、对象、数组、条件、循环
  • 模块化基础:importexport
  • 命令行基础:会执行 nodenpmnpx

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

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

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

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

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

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

必须吃透:

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

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

先知道,后深入:

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

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

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

7. 学习本质

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

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

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

8. 设计哲学

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

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

学习顺序

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

  1. 入门认知:TS 是什么、为什么存在、怎么运行第一段代码
  2. 基础类型:原始类型、数组、对象、函数、类型推断
  3. 类型建模:interfacetype、可选属性、只读属性、联合类型
  4. 类型收窄:分支判断、判空、typeofin、类型保护
  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 契约

必须掌握:

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

知道即可:

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

第一阶段:入门认知

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

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

1. 学什么

这一节学习:

  • TS 和 JS 的关系
  • TS 出现的原因
  • TS 的基本工作方式
  • 第一个最小 TS 程序如何运行
  • tscnodets-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. tscnodets-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. tscnode 各自负责什么?

动手自测

  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. 说出 tscts-nodenode 的区别。
练习 4:实操作业

请你独立完成下面任务:

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

10. 学完标志

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

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

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

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

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

  • 基础类型系统
  • 类型推断
  • 对象、数组、函数类型
  • anyunknownnever

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

相关推荐
2501_920627612 小时前
Flutter 框架跨平台鸿蒙开发 - 编程代码库应用
学习·算法·flutter·华为·harmonyos
Xudde.2 小时前
班级作业笔记报告0x07
笔记·学习·安全·web安全·php
AnalogElectronic2 小时前
python后端的学习笔记1
笔记·python·学习
y = xⁿ2 小时前
(小林coding) 计算机网络学习笔记:什么是HTTP?
笔记·学习·计算机网络
咬_咬2 小时前
go语言学习(变量定义与输入输出)
开发语言·学习·golang·io·go语言··go变量定义
程序员雷欧2 小时前
大模型应用开发学习第四天
学习
炽烈小老头2 小时前
【每天学习一点算法 2026/04/03】二叉树的序列化与反序列化
学习·算法
童话名剑2 小时前
YOLO v8(学习笔记)
笔记·学习·yolo