输入标题、正文或标签,查找知识。

最近文档

软件工程 / 构建发布与运行构建环境与持续集成:为什么你电脑上能跑还不够你把收藏功能交给同事,他安装以后却打不开。原来你电脑用的是一个 Node 版本,他用另一个;你本地还有没提交的文件。要交付软件,不只需要源代码,还要让别人按照明确步骤得到能运行的结果。软件工程 / 构建发布与运行部署、发布、回滚与观察:把功能交到用户手里代码已经合并,收藏按钮却没出现在网站上。或者网站更新了,点击时提示找不到数据表。交付涉及代码、配置、数据和流量,不能只用“构建成功”判断完成。本章按一次小发布看这些环节怎样配合。语言基础 / TypeScript跨语言对照TypeScript 独有能力与缺失能力清单这一章适合在学完基础后回查:某个能力是 TypeScript 自己提供的,还是来自 JavaScript、浏览器、Node 或第三方库?先把来源认清,再讨论它擅长什么、缺少什么,就不会把“语言没有内置”误解成“整个生态都做不到”。语言基础语言基础学习路线:以 TypeScript 建立可迁移的编程模型学 TypeScript 时,你会同时遇到 JavaScript 的运行规则和 TypeScript 的类型规则。先把这两件事分清,很多报错就好理解了。按顺序做完前面的练习,再读跨语言对照;对照章节用于解释差异,不要求你同时学会五门语言。后端知识 / 身份权限与安全认证、授权与多租户:登录成功只是第一步用户把地址里的订单号从 42 改成 43,居然看到了别人订单。这不是登录失效,而是资源授权缺失。后端要分别确认调用者是谁,以及这个调用者是否能对这份数据执行当前操作。
1 / 5 · 构建环境与持续集成:为什么你电脑上能跑还不够
↑↓ 浏览 Enter 打开Esc 关闭
Damnatiox
知识文件夹

TypeScript语言基础

编程语言基础与跨语言模型:从 TypeScript 到 JavaScript、Java、Python、C++:TypeScript语言基础

0 子目录18 文档
TypeScript 基础:运行与编译、变量与数据、函数与对象、联合与收窄、泛型与类型运算、模块与异步、工程与实战

CHAPTER OVERVIEW · 章节概览

先运行一段程序,再理解数据与函数;掌握日常类型表达后,再进入泛型、类型运算和工程实践。

本章学习路线

箭头表示建议的学习顺序;先理解问题,再逐步进入实现与实践。

flowchart LR N0["01 运行与编译"] N1["02 变量与数据"] N2["03 函数与对象"] N3["04 联合与收窄"] N4["05 泛型与类型运算"] N5["06 模块与异步"] N6["07 工程与实战"] N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6

按顺序学习

18
环境配置与第一个 TypeScript 项目刚开始学 TypeScript,最容易卡住的往往不是语法,而是:安装好了,接下来到底运行哪个文件?编辑器没有报错,是不是就算程序写对了?TypeScript 运行模型、类型擦除与编译产物上一章里,我们写的是 .ts,最后交给 Node 的却是 .js。那中间到底少了什么? 先记住一个实际后果:给数据写上类型,不代表程序运行时会替你检查数据。 比如接口声明说用户编号是字符串,服务器照样可能发来一个数字。要理解为什么,最好亲自看一次编译结果。变量、原始类型、字面量类型与类型推断如果把每个变量后面都补上 : string、: number,代码会长不少,却未必更清楚。TypeScript 常常已经知道一个值的类型。我们真正需要学的,是看懂它推断出了什么,以及什么时候该补充说明。 这篇从一个网站名字和一个计数器开始。碰到新术语时,先看代码具体允许你做什么,再记术语。数组、元组、对象、索引签名与只读边界用户列表适合用数组,一对坐标可能适合用元组,用户资料则常用对象。这几种写法都在描述数据,却有不同的限制。下面从“能放什么、怎样读取、能否修改”三个问题入手,顺便分清只读类型和运行时冻结对象的区别。函数签名、重载、this、回调与可调用对象写函数时,调用者最关心两件事:我能传什么,拿回来什么?函数签名就是对这两件事的说明。先掌握普通参数和返回值,再看重载、回调和 this;它们是在普通签名不够清楚时补充表达能力,而不是每个函数都必须使用的技巧。interface、type 与结构化类型系统刚接触 TypeScript 时,同一个对象既能用 interface 描述,又能用 type 描述,确实容易困惑。先看它们共同解决的问题:描述对象需要有哪些成员。随后再比较扩展、合并和联合类型,按实际需要选择,而不必先站队。联合、交叉、控制流收窄与穷尽检查接口请求可能成功,也可能失败。如果把所有字段都写成可选,调用时就很难知道哪些值一定存在。联合类型允许我们把不同情况分别写清,再通过判断进入对应分支。本章会把这种判断过程与普通的 if 代码连起来讲。泛型、约束、推断、默认参数与变型第一次看到 <T>,容易觉得它是一套额外的符号规则。其实先不用记符号:想想你有没有写过两个几乎一样的函数,一个处理数字数组,另一个处理用户数组,只因为参数类型不同,就复制了一份代码。 泛型要解决的是这种重复,同时保留具体的类型信息。我们先写一个取数组首项的函数,再逐步看约束、多个类型参数和变型。后半篇稍难,可以先把前几个例子运行明白。类、继承、抽象、访问控制与组合如果你学过 Java,看到 class、extends 和 private 会觉得很熟悉,但先别把原来的规则原样搬过来。这里从一个类的实例和方法开始,分清哪些约束只在类型检查时存在,哪些会真正留在 JavaScript 运行时。模块、包、模块解析与声明文件编辑器能跳转到一个包的类型定义,程序运行时却提示找不到模块,这并不矛盾。类型文件和实际执行的 JavaScript 是两条需要对齐的路径。下面沿着一次 import,分别看编译器、Node 和构建工具会去哪里找文件。keyof、typeof、索引访问与标准工具类型假设用户对象已经有一份类型定义,表单、更新接口和字段选择器还要各抄一份吗?keyof、索引访问和工具类型能从已有定义推导出新类型。先理解推导前后的关系,再记各个工具的名字,会比背一张语法表更容易。映射类型、条件类型、模板字面量类型与 infer当多个类型只有一处规律性的差别时,手工维护很容易漏改。映射类型和条件类型可以表达这种规律。下面先看简单的输入与结果,再逐步读 infer 和模板字面量;如果一种写法已经难以向同事解释,就值得考虑更直接的方案。tsconfig、严格模式、项目引用与工程编译tsconfig.json 看起来只是几个开关,但它会影响哪些文件被检查、哪些 API 被认为存在,以及代码怎样输出。不要急着复制一份很长的配置。先确定代码在哪里运行,再逐项理解严格检查和模块选项,就能解释为什么需要这些设置。异步、错误边界、DOM 与 Node.js 类型一个函数返回 Promise<User>,只说明成功时会拿到什么,并没有说明等多久、失败怎么办。异步程序的这些行为仍要自己设计。下面把类型写法放回浏览器和 Node 的实际执行过程,看看请求、取消和错误是怎样传递的。装饰器、JSX、枚举、namespace 与特殊语法边界装饰器、JSX 和一些特殊语法常出现在框架教程里,初看很像语言自带的魔法。这里先分清:哪些由 JavaScript 执行,哪些需要编译转换,哪些还取决于框架或历史配置。理解这一点,再读生成的代码就不容易混淆。测试、构建、Lint、发布与 JavaScript 迁移编辑器里没有红线,只能说明通过了当前配置下的类型检查。程序是否按预期工作、打包后是否能被别人使用,还需要另外验证。本章按开发到发布的顺序,把类型检查、测试、Lint 和构建各自负责的事情串起来。TypeScript 综合项目:可靠的配置加载器与类型安全客户端现在可以把前面的语法放进一个小项目了:接收外部数据,检查格式,再调用异步逻辑并给出结果。先把这一条路径做通,然后故意传错数据、取消请求、制造失败。这样的练习能看出你是否真正理解类型与运行时的分工。TypeScript 官方资料、学习顺序与版本边界遇到不熟悉的语法,可以先在 Handbook 找解释;遇到配置报错,再查 TSConfig Reference。不必从头读完所有官方文档。本页把这些入口按用途整理在一起,并单独记录版本相关说明,方便你判断一个例子是否适用于手头的编译器。