TypeScript 速查表
最后更新
基础类型
原始类型,以及如何给变量加类型注解。
| 操作 | 语法 |
|---|---|
| 字符串 | let name: string = "Ada"; |
| 数字 | let age: number = 25; |
| 布尔值 | let ok: boolean = true; |
| T 类型的数组 | let xs: number[] = [1, 2, 3]; |
| 泛型数组 | let xs: Array<string> = []; |
| 元组 | let pair: [string, number] = ["a", 1]; |
| any(关闭类型检查) | let x: any = 1; |
| unknown(更安全的 any) | let x: unknown = JSON.parse(s); |
| void(无返回值) | function log(): void { … } |
| never(永不返回) | function fail(): never { throw … } |
| Null / undefined | let n: null = null; |
类型推断与类型注解
什么时候让 TS 自动推断,什么时候手动注解。
| 操作 | 语法 |
|---|---|
| 根据值推断 | let count = 0; // number |
| 显式注解 | let count: number = 0; |
| 函数参数 | function add(a: number, b: number) { … } |
| 返回值类型 | function add(a: number, b: number): number { … } |
| 箭头函数 | const sq = (x: number): number => x * x; |
| 类型断言 | const el = input as HTMLInputElement; |
| const 断言(字面量) | const dirs = ["up", "down"] as const; |
| 非空断言 | el!.focus(); |
接口
描述对象的结构。
| 操作 | 语法 |
|---|---|
| 声明 | interface User { id: number; name: string; } |
| 可选属性 | interface User { age?: number; } |
| 只读属性 | interface User { readonly id: number; } |
| 方法签名 | interface Logger { log(msg: string): void; } |
| 继承另一个接口 | interface Admin extends User { role: string; } |
| 索引签名 | interface Map { [key: string]: number; } |
| 在类中实现接口 | class Db implements Logger { … } |
类型别名与联合类型
给类型起名字,并用 | 和 & 组合类型。
| 操作 | 语法 |
|---|---|
| 类型别名 | type ID = string | number; |
| 对象类型别名 | type User = { id: number; name: string }; |
| 联合类型 | type Status = "idle" | "loading" | "done"; |
| 交叉类型 | type Admin = User & { role: string }; |
| 字面量类型 | type Yes = "yes"; |
| Nullable | type Maybe<T> = T | null | undefined; |
| 函数类型别名 | type Handler = (e: Event) => void; |
函数
带类型的参数、返回值和重载。
| 操作 | 语法 |
|---|---|
| 可选参数 | function greet(name?: string) { … } |
| 默认参数 | function greet(name = "friend") { … } |
| 剩余参数 | function sum(...ns: number[]): number { … } |
| 函数类型 | let fn: (a: number) => number; |
| 可调用接口 | interface Fn { (x: number): number; } |
| 重载签名 | function f(x: string): string; function f(x: number): number; function f(x: any) { return x; } |
| void 返回值会被忽略 | const cb: () => void = () => 42; // ok |
类
带访问修饰符和参数属性的类。
| 操作 | 语法 |
|---|---|
| 声明类 | class User { name: string; } |
| 构造函数 | constructor(name: string) { this.name = name; } |
| 参数属性 | constructor(public name: string) {} |
| public / private / protected | private id: number; |
| 只读字段 | readonly id: number; |
| 静态成员 | static count = 0; |
| getter / setter | get name() { return this._name; } |
| 继承 | class Admin extends User { … } |
| 抽象类 | abstract class Shape { abstract area(): number; } |
泛型
以其他类型为参数、可复用的类型。
| 操作 | 语法 |
|---|---|
| 泛型函数 | function id<T>(x: T): T { return x; } |
| 显式指定类型调用 | id<string>("hi"); |
| 泛型接口 | interface Box<T> { value: T; } |
| 泛型类型别名 | type Pair<A, B> = [A, B]; |
| 泛型类 | class Stack<T> { items: T[] = []; } |
| 用 extends 约束 | function len<T extends { length: number }>(x: T) { return x.length; } |
| 默认类型参数 | interface Box<T = string> { value: T; } |
| keyof 运算符 | type K = keyof User; // "id" | "name" |
| 索引访问类型 | type Name = User["name"]; |
类型收窄
在运行时把联合类型细化为单一类型。
| 操作 | 语法 |
|---|---|
| typeof 检查 | if (typeof x === "string") { … } |
| instanceof 检查 | if (e instanceof Error) { … } |
| in 运算符 | if ("name" in obj) { … } |
| 相等性收窄 | if (status === "done") { … } |
| 真值判断 | if (value) { … } |
| 自定义类型守卫 | function isUser(x: any): x is User { return "id" in x; } |
| 可辨识联合 | type Shape = { kind: "sq"; size: number } | { kind: "ci"; r: number }; |
| 用 never 做穷尽检查 | const _: never = shape; |
枚举
一组具名常量。
| 操作 | 语法 |
|---|---|
| 数字枚举 | enum Direction { Up, Down, Left, Right } |
| 字符串枚举 | enum Status { Idle = "IDLE", Done = "DONE" } |
| 使用某个值 | let d: Direction = Direction.Up; |
| const 枚举(编译时内联) | const enum Color { Red, Green, Blue } |
| 字面量联合类型(现代写法) | type Status = "idle" | "done"; |
工具类型
用来转换已有类型的内置辅助类型。
| 操作 | 语法 |
|---|---|
| 所有属性变为可选 | Partial<User> |
| 所有属性变为必填 | Required<User> |
| 所有属性变为只读 | Readonly<User> |
| 选取部分键 | Pick<User, "id" | "name"> |
| 排除一个或多个键 | Omit<User, "password"> |
| 由指定键构成的对象 | Record<string, number> |
| 从联合类型中排除 | Exclude<"a" | "b" | "c", "a"> |
| 从联合类型中只保留 | Extract<"a" | "b", "a" | "c"> |
| 去掉 null / undefined | NonNullable<string | null> |
| 函数的返回值类型 | ReturnType<typeof fn> |
| 函数参数组成的元组 | Parameters<typeof fn> |
| Promise 解析后的类型 | Awaited<Promise<string>> |
模块
在文件之间导入和导出。
| 操作 | 语法 |
|---|---|
| 命名导出 | export function add(a: number, b: number) { … } |
| 默认导出 | export default class User { … } |
| 重新导出 | export { User } from "./user"; |
| 命名导入 | import { add } from "./math"; |
| 默认导入 | import User from "./user"; |
| 只导入类型 | import type { User } from "./user"; |
| 导入全部内容 | import * as math from "./math"; |
| 三斜线指令 | /// <reference types="node" /> |
tsconfig 常用配置
值得了解的编译器选项。
| 选项 | 作用 |
|---|---|
"strict": true | 开启所有严格模式检查(推荐)。 |
"target": "ES2022" | tsc 输出的 JavaScript 版本。 |
"module": "ESNext" | 输出代码使用的模块系统。 |
"moduleResolution": "bundler" | 按现代打包工具的方式解析模块。 |
"jsx": "react-jsx" | 为 React 17+ 启用 JSX。 |
"esModuleInterop": true | 从 CommonJS 模块默认导入时更简洁。 |
"skipLibCheck": true | 跳过 node_modules 的类型检查(构建更快)。 |
"noEmit": true | 只做类型检查,输出交给打包工具。 |
最常用的 TypeScript 语法,全都在这一页。这份 TypeScript 速查表是日常 TS 开发的快速参考:基础类型、接口、类型别名、泛型、联合类型、类型收窄,以及内置的工具类型。TypeScript 建立在 JavaScript 之上,所以底层语法可以随时翻看 JavaScript 速查表。
这里的内容都是标准 TypeScript,可以用 tsc 编译,并在任何支持现代 JavaScript 的环境中运行。需要什么就复制什么,也可以在 TypeScript 在线编辑器里直接运行任意代码片段,无需安装。刚接触类型?Coddy 的免费交互式 TypeScript 课程会从 JavaScript 出发,一步步带你掌握类型。
TypeScript 速查表常见问题
这份 TypeScript 速查表免费吗?
免费。这份 TypeScript 速查表完全免费,无需注册。收藏起来,需要查某个类型、接口或工具类型时随时回来看。
接口和类型别名有什么区别?
interface 表达不了的。常见的做法是:公开的对象结构用 interface,联合类型、元组和计算出来的类型用 type。any 和 unknown 有什么区别?
any 完全关闭类型检查,编译器允许你对它做任何操作。unknown 是类型安全的:使用之前必须先收窄它(用 typeof、instanceof 或类型守卫)。对于来自外部的值,比如 JSON.parse 或 fetch 的结果,优先使用 unknown,它会强制你先校验再使用。学 TypeScript 之前需要先学 JavaScript 吗?
需要。TypeScript 就是在 JavaScript 之上加了一层类型系统,所以你掌握的每项 JavaScript 技能都能直接用上。如果你还在打 JS 基础(数组、对象、async/await),JavaScript 速查表是不错的起点,Coddy 的免费 JavaScript 课程也会以交互的方式讲解同样的内容。
可以在线练习 TypeScript 吗?
可以。打开 TypeScript 在线编辑器,就能在浏览器里运行这份速查表中的任何代码片段,无需安装。想要系统学习的话,可以先从 JavaScript 课程学起,再在此基础上用上本页的类型知识。