TypeScript 是由微软开发并维护的开源编程语言,作为 JavaScript 的语法超集,它在 JavaScript 的基础上引入了可选的静态类型系统、类、接口、泛型等特性,旨在提升大型 JavaScript 应用的开发效率和代码可维护性。TypeScript 代码经过编译后生成纯 JavaScript,可运行在浏览器、Node.js、Deno、Bun 等任何支持 JavaScript 的环境中。自 2012 年首次发布以来,TypeScript 已成为现代前端开发的事实标准,2025 年 8 月超越 JavaScript 和 Python 成为 GitHub 上使用量最高的编程语言。
string、number、boolean)、复合类型(数组、元组、对象)以及高级类型(联合类型、交叉类型、映射类型等)// @ts-check 指令在 JavaScript 文件中启用类型检查.js 和 .ts 文件public、private、protected): TypeName 语法手动指定类型strict 模式:开启所有严格检查选项,包括 noImplicitAny、strictNullChecks、strictFunctionTypes 等any、允许 null/undefined 赋值给任意类型strict 模式默认开启let x = 3 被推断为 number,let name = "Alice" 被推断为 stringconst 声明的变量会保留更精确的字面量类型,let 声明的变量会被"宽化"为一般类型let arr = [1, 2, 3] 推断为 number[],let mixed = [1, "two", 3] 推断为 (string | number)[]window.onmousedown = function(event) 中,event 被推断为 MouseEvent 类型any 后不再进行类型检查,等同于退出类型系统any 会"传染",对 any 类型的操作结果仍是 any,容易引入运行时错误catch 块中的错误对象any 的核心区别:unknown 强制开发者在使用前证明值的类型,保留了类型安全neverswitch 语句的 default 分支中将判别字段赋值给 never 类型变量,确保所有情况都被处理unknown 替代 any,在类型边界处进行收窄catch 块中,错误对象默认为 unknown 类型(useUnknownInCatchVariables 选项)never 进行穷尽检查,当联合类型新增成员时,编译器会报错提示遗漏的分支interface 支持声明合并:同名接口可以被多次声明,TypeScript 会自动合并它们的定义type 不支持重声明:重复定义同名类型别名会导致编译错误interface 成为扩展第三方库类型、增强全局类型(如 Window)的首选type 可以表示联合类型(A | B)、交叉类型(A & B)、元组类型、映射类型、条件类型等interface 只能描述对象形状,不能直接表示联合类型或映射类型typeinterface 使用 extends 关键字扩展:interface Dog extends Animal { ... }type 使用 & 交叉运算符组合:type Dog = Animal & { ... }extends 会在扩展时立即检查兼容性并报错;& 在遇到冲突属性时可能静默生成 never 类型interface 保留名称,编译器错误信息更简洁易读type 在错误信息中会展开为完整的结构描述,复杂类型可能显示冗长interfacetypeT、K、V)是类型的"占位符",在调用时被具体的类型替换any 丢失类型信息,也避免了为每种类型编写重复代码function identity<T>(arg: T): T { return arg; }identity(42) 中 T 被推断为 numberfunction pair<T, U>(first: T, second: U): [T, U]extends 关键字约束类型参数必须满足的条件function getLength<T extends { length: number }>(item: T): number 确保 T 具有 length 属性keyof 约束:function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] 确保 key 是 T 的合法属性名type IsArray<T> = T extends any[] ? true : falseinfer 关键字在条件类型中提取未知类型:type ReturnType<T> = T extends (...args: any[]) => infer R ? R : nevertype Readonly<T> = { readonly [K in keyof T]: T[K] }Partial、Required、Pick、Omit、Record 等)均基于映射类型实现type Getters<T> = { [K in keyof T as get${Capitalize<string & K>}]: () => T[K] }typeof、instanceof 等),类型收窄是编译时的分析结果typeof:收窄基础类型,如 typeof x === "string" 将 x 收窄为 stringinstanceof:收窄类实例类型,如 error instanceof TypeError 将 error 收窄为 TypeErrorin:检查属性是否存在,如 "swim" in animal 根据属性存在性收窄对象类型Array.isArray:收窄为数组类型x === null、x !== undefined 或比较判别字段value is TypeName,告诉 TypeScript 当函数返回 true 时参数具有指定类型function isString(x: unknown): x is string { return typeof x === "string"; }asserts 关键字,在断言失败时抛出异常,成功时收窄类型function assertIsString(value: unknown): asserts value is stringkind、type),通过检查该属性值进行收窄switch 语句中,每个 case 分支自动收窄到对应的联合成员never 类型在 default 分支进行穷尽检查:当联合类型新增成员时,编译器会报错提示遗漏public(默认)、private、protected 三种访问修饰符private 成员只能在声明它的类内部访问protected 成员可以在声明它的类及其子类中访问constructor(public name: string)readonly 修饰符结合使用readonly 修饰符声明的属性只能在声明时或构造函数中赋值# 私有字段不同,readonly 不是运行时隐私保护implements 关键字实现一个或多个接口# 私有字段语法,提供运行时隐私保护# 私有字段在编译后仍保留隐私检查,无法从外部访问private 修饰符相比,# 提供了更强的封装性Direction.Up 返回 0),也可以通过数值获取名称(Direction[0] 返回 "Up")Direction.Up === 0 为 true,可能导致意外的类型混淆const enum 声明,编译时会将枚举值内联到每个使用位置isolatedModules 模式不兼容isolatedModules,因此 const enum 在这些环境中可能无法正常工作"PENDING" | "ACTIVE" | "CLOSED")提供相同的编译时类型安全,且编译后零运行时开销isolatedModules 完全兼容switch 语句的判别字段,与联合类型配合使用enum Mixed { No = 0, Yes = "YES" }import 或 export 语句的文件都被视为模块import 和 export 关键字进行模块的导入和导出export const pi = 3.14)和默认导出(export default function)import * as math from "./math")和重命名导入(import { pi as π } from "./math")import type { Cat } from "./animal"),仅导入类型而不导入运行时代码module.exports 导出和 require() 导入module 配置选项自动在 ES 模块和 CommonJS 之间转换./ 或 ../ 开头,从当前文件位置解析node_modules 中查找,或通过 baseUrl 和 paths 配置的路径别名解析.ts、.tsx、.d.ts 文件,或 package.json 中的 types/typings 字段node/node16/nodenext 解析策略模拟 Node.js 的模块解析行为bundler 解析策略适用于 Webpack、Vite 等打包工具declare module "module-name" 为没有类型定义的 JavaScript 模块声明类型declare module "*.svg" 匹配所有 SVG 导入tsc)读取 .ts 源文件,进行词法分析、语法分析、类型检查tsconfig.json 是 TypeScript 项目的配置文件,定义了编译选项和包含的文件范围tsc 时会自动读取该配置,无需在命令行中重复指定选项extends),便于在多个项目间共享配置target:指定编译输出的 ECMAScript 版本(如 ES2020、ESNext)module:指定模块系统(ESNext、CommonJS、NodeNext、Bundler 等)moduleResolution:指定模块解析策略(node、node16、nodenext、bundler)strict:开启所有严格类型检查选项noEmit:仅执行类型检查,不生成输出文件(适用于 CI 或仅用于类型检查的场景)declaration:生成对应的 .d.ts 声明文件sourceMap:生成 source map 文件,便于调试outDir:指定编译输出目录include / exclude:指定需要编译或排除的文件范围skipLibCheck:跳过对声明文件(.d.ts)的类型检查,加快编译速度esModuleInterop:允许从 CommonJS 模块使用默认导入strict 是一个复合选项,开启后会自动启用以下检查:noImplicitAny:禁止隐式 any 类型strictNullChecks:null 和 undefined 只能赋值给自身或 neverstrictFunctionTypes:函数类型检查更严格strictBindCallApply:严格检查 bind、call、apply 的参数strictPropertyInitialization:类属性必须在构造函数中初始化noImplicitThis:禁止 this 隐式为 anyalwaysStrict:始终以严格模式编译.d.ts)只包含类型信息,不包含任何可执行代码declare 关键字声明在运行时存在但不在当前文件中定义的变量、函数、类或模块declare const __APP_VERSION__: string 声明一个全局常量lodash 声明类型:declare module "lodash" { export function chunk<T>(array: T[], size: number): T[][]; }.d.ts 文件中,并在 tsconfig.json 的 include 范围内npm install --save-dev @types/library-name 安装tsconfig.json 中启用 "declaration": true,编译时会自动生成 .d.ts 文件"declarationMap": true 生成声明文件的 source map,支持"跳转到定义"功能"emitDeclarationOnly": true 可以只生成声明文件,不生成 JavaScript 输出declare module "module-name" 为已有类型的模块添加新的类型定义Request 对象添加自定义属性npm install --save-dev typescriptnpx tsc --inittsconfig.json 以支持渐进式采用:"allowJs": true:允许编译 JavaScript 文件"checkJs": false:暂不对 JavaScript 文件进行类型检查"strict": false:初始时关闭严格模式"noEmit": true:仅执行类型检查,不生成输出文件.js 文件重命名为 .ts(或 .tsx 用于包含 JSX 的 React 组件)any 类型interface 或 type 定义any 作为过渡,但应标记为待办项noImplicitAny:修复隐式 any 类型strictNullChecks:处理 null 和 undefinedstrict: truetsconfig.json 文件,为不同目录设置不同的严格程度unknown 类型处理外部输入,在使用前进行类型收窄.d.ts),提供基本的类型支持tsc --noEmit 进行类型检查ts-migrate 等自动化工具批量转换文件jscodeshift 编写 codemod 脚本自动化类型注解的添加interface 定义,替代 PropTypes 运行时验证useState、useReducer、useContext 等 Hook 的状态类型可以通过泛型显式指定onClick、onChange)的参数类型由 React 提供,避免手动查找类型React.FC<Props> 或函数声明配合返回类型定义组件defineProps<T>() 定义类型化的 Props,defineEmits<T>() 定义类型化的事件ref、computed、watch 等函数提供优秀的类型推断vue-tsc 进行类型检查,支持单文件组件(.vue)@Component、@Injectable、@Module)是 TypeScript 特性,Angular 深度使用React.ComponentProps、Vue 的 ComponentPublicInstancewatch 模式使用增量编译,通常只需 1~3 秒@typescript-eslint/eslint-plugin 和 @typescript-eslint/parser 提供 TypeScript 特定的代码检查规则eslint-plugin-prettier 与 ESLint 集成ts-jest 或 @swc/jest 支持 TypeScript