类型分类、联合类型、交叉类型
类型分类体系基础类型1. 字符串类型string2. 数字类型number3. 布尔类型boolean4. 大整数类型bigint5. 符号类型symbol6. undefined 和 null7. 字面量类型 限定了值必须是某个具体的字面量字面量类型包括字符串字面量、数字字面量和布尔字面量。对象类型Object类型表示所有非原始类型即所有对象。Object是所有引用类型的根类型类似于 Java 中的Object类。// Object 类型可以接受任何对象 let obj: Object { name: Alice }; // ✅ obj [1, 2, 3]; // ✅ 数组是对象 obj function() {}; // ✅ 函数是对象 obj new Date(); // ✅ Date 是对象 obj /regex/; // ✅ 正则表达式是对象TS新增类型类型核心含义使用场景安全性any任意类型关闭类型检查迁移旧代码、第三方库❌ 最不安全unknown未知类型安全的 any处理未知值、API 响应✅ 安全需收窄void无返回值函数没有返回值✅ 安全never永不返回异常、无限循环、穷尽检查✅ 最严格enum枚举常量集合定义一组相关常量✅ 安全unknown是any的类型安全版本。它表示一个未知的值但不允许你直接操作它必须先进行类型收窄类型守卫。unknown 的实际应用// 1. API 响应处理 async function fetchData(url: string): Promiseunknown { const response await fetch(url); const data await response.json(); return data; // 返回 unknown } async function getUser(id: number): PromiseUser { const data await fetchData(/api/users/${id}); // 必须验证数据类型 if (typeof data object data ! null) { const user data as any; if (typeof user.id number typeof user.name string) { return user as User; } } throw new Error(Invalid user data); } // 2. 错误处理TypeScript 4.0 try { // 某些操作 throw new Error(Something went wrong); } catch (error) { // error 类型是 unknown if (error instanceof Error) { console.log(error.message); } else if (typeof error string) { console.log(error); } else { console.log(Unknown error); } } // 3. 类型断言谨慎使用 let data: unknown hello world; let str: string data as string; // 断言为 string console.log(str.length); // 可以never表示永远不会发生的值。它是 TypeScript 类型系统的底部类型没有任何值可以赋值给never类型。never 是任何类型的子类型// never 是任何类型的子类型 let str: string hello; // str neverVar; // 但反过来不行 // never 可以赋值给任何类型 function getNever(): never { throw new Error(Never); } let numberVar: number getNever(); // ✅ 可以 let stringVar: string getNever(); // ✅ 可以 let booleanVar: boolean getNever(); // ✅ 可以 // 但是没有任何类型可以赋值给 never // let neverVar: never hello; // ❌ 错误 // let neverVar2: never 42; // ❌ 错误 // let neverVar3: never undefined; // ❌ 错误联合类型表示一个值可以是多种类型中的一种用竖线|分隔。它表达了逻辑上的或OR关系。联合类型就像是一个类型开关变量可以在多个类型之间切换但一次只能是一种类型。// 基础语法 type MyType Type1 | Type2 | Type3; // 示例字符串或数字 let id: string | number; id abc123; // ✅ id 12345; // ✅ // id true; // ❌ 错误boolean 不在联合中// 基础类型 type ID string | number; type Result string | number | boolean; type Nullable string | null | undefined;// 函数联合类型 type StringProcessor (input: string) string; type NumberProcessor (input: number) number; type Processor StringProcessor | NumberProcessor;// 字符串字面量联合 type Direction up | down | left | right; type HttpMethod GET | POST | PUT | DELETE;交叉类型交叉类型Intersection Types表示一个值同时具有多种类型的所有成员用与符号连接。它表达了逻辑上的与AND关系。交叉类型就像是类型合并器把多个类型的属性全部组合到一个新类型中。它可以被理解为所有类型的交集。如果交叉的两个对象属性如果存在相同但是类型不同 就会冲突报错。// 基础语法 type Combined Type1 Type2 Type3; // 示例合并两个接口 interface Person { name: string; age: number; } interface Employee { employeeId: string; department: string; } // 交叉类型同时具有 Person 和 Employee 的所有属性 type EmployeePerson Person Employee; const worker: EmployeePerson { name: Alice, // 来自 Person age: 30, // 来自 Person employeeId: E001, // 来自 Employee department: Engineering // 来自 Employee };TypeScript 中 Interface 和 Class 的区别详解特性Interface接口Class类本质纯类型定义既是类型又是值编译后完全消失变成 JavaScript 代码作用描述对象结构创建对象蓝图实例化❌ 不能 new✅ 可以 new方法实现❌ 只有声明✅ 可以包含实现访问修饰符❌ 不支持✅ public/private/protected继承✅ 可以继承多个✅ 只能单继承