TypeScript 中的 "类型"(Type)是对值的结构和行为的抽象描述。它不直接参与运行时,而是在编译阶段用于约束值的形态,确保代码符合预期的契约。
1.核心作用:定义 "允许的值" 的范围和操作规则
2.与 JavaScript 的关系:TS 的类型系统是对 JS 值的补充描述,所有 JS 值在 TS 中都有对应的类型映射
3.关键特性:TypeScript 采用结构类型系统(Structural Typing),即类型兼容性基于结构是否匹配,而非名义上的类型名称(与 Java 等名义类型系统不同)
TypeScript 的类型检查是一个编译时的静态分析过程,其核心原理包括:
-
类型解析与推断
- TS 编译器会解析代码中的类型注解(如
: number
)
- 对于没有显式注解的代码,通过 "类型推断" 自动推导类型(基于赋值、运算等上下文)
- 示例:
let x = 10
会被推断为number
类型
-
类型检查器(Type Checker)
- 核心模块负责验证代码是否符合类型规则
- 检查维度包括:变量赋值、函数参数 / 返回值、属性访问、运算操作等
- 若发现类型不兼容(如
string
赋值给number
变量),则抛出编译错误
-
类型擦除(Type Erasure)
- TS 最终会编译为纯 JavaScript 代码,所有类型信息会被完全移除
- 类型仅在开发和编译阶段起作用,不影响运行时性能
-
结构类型匹配
- 两个类型兼容的判定标准:只要结构上满足 "子集关系" 即可
type A = { name: string };
type B = { name: string; age: number };let a: A = { name: "Alice" };
let b: B = { name: "Bob", age: 20 };a = b; // 合法:B包含A的所有属性
b = a; // 错误:A缺少B的age属性
为变量、函数参数和返回值指定类型:
// 变量类型
let count: number = 10;
let message: string = "hello";
let isDone: boolean = false;// 函数类型
function add(a: number, b: number): number {return a + b;
}
通过type
定义复合类型或别名:
// 类型别名
type ID = number | string; // 联合类型// 对象类型
type User = {id: ID;name: string;age?: number; // 可选属性readonly createdAt: Date; // 只读属性
};// 函数类型
type MathOperation = (x: number, y: number) => number;
const multiply: MathOperation = (a, b) => a * b;
-
联合类型:表示值可以是多种类型中的一种
type Status = "pending" | "success" | "error";
let currentStatus: Status = "pending"; // 只能是指定的三个值
-
交叉类型:合并多个类型的属性
type A = { x: number };
type B = { y: string };
type C = A & B; // { x: number; y: string }
-
泛型:参数化类型,提高复用性
在条件判断中精确类型:
type Foo = { type: "foo"; a: number };
type Bar = { type: "bar"; b: string };
type FooBar = Foo | Bar;function handle(value: FooBar) {if (value.type === "foo") {// 类型缩小为Foo,可安全访问a属性
console.log(value.a);} else {// 类型缩小为Bar,可安全访问b属性
console.log(value.b);}
}
TypeScript 的 Type 类型是一套编译时的静态约束系统,通过描述值的结构来实现代码校验。其核心价值在于:
- 提前发现类型错误,减少运行时 bug
- 提供清晰的代码文档和类型提示
- 支持复杂的类型组合,适配 JS 的灵活场景
理解 Type 类型的关键是把握 "结构类型" 和 "静态检查" 这两个核心特性,在此基础上可以逐步掌握更复杂的类型操作。