以下是 TypeScript 核心类型特性对比表,涵盖关键概念的定义、特点、适用场景及示例,帮助快速理解核心差异:

特性类别

具体特性 定义 / 核心逻辑 关键特点 适用场景 示例代码
类型匹配方式 结构类型(Structural) 基于类型的 “结构”(属性、方法)判断兼容性,不依赖名义(如是否显式声明继承)。 符合 JavaScript 鸭子类型思想,灵活度高,注重 “形状匹配”。 跨模块 / 库的类型复用、避免强耦合的类型依赖。 typescript interface A { x: number } interface B { x: number } let a: A = { x: 1 }; let b: B = a; // 合法(结构一致)
名义类型(Nominal) 基于类型的 “名义”(如类名、显式继承关系)判断兼容性,需显式关联。 严格依赖类型名称或继承关系,约束性强,注重 “身份匹配”。 需要严格区分语义不同但结构相同的类型(如 UserId 和 PostId)。 typescript // 用类模拟名义类型 class UserId { constructor(public value: number) {} } class PostId { constructor(public value: number) {} } let u: UserId = new PostId(1); // 报错(名义不同)
类型定义方式 显式类型(Explicit) 开发者手动标注变量、函数等的类型(如 : number)。 代码意图清晰,减少推断歧义,适合复杂场景。 函数参数 / 返回值、复杂对象、团队协作中需明确约束的场景。 typescript function add(a: number, b: number): number { return a + b; }
隐式类型(Implicit) TypeScript 自动根据上下文(如初始化值)推导类型,无需手动标注。 减少代码冗余,降低编写成本,适合简单场景。 变量初始化、简单函数返回值、临时变量等。 typescript let name = "Alice"; // 推断为 string let sum = (a: number, b: number) => a + b; // 推断返回值为 number
类型复用机制 泛型(Generics) 通过 “类型参数”(如 <T>)定义通用类型,适配多种具体类型,同时保持约束。 类型层面的 “函数”,实现类型复用,避免重复定义,且保证类型安全。 通用工具函数(如数组处理)、容器类(如 Array<T>)、组件参数类型。 typescript function identity<T>(arg: T): T { return arg; } const num: number = identity(123); const str: string = identity("hello");
普通类型(Non-generic) 针对特定类型定义,无类型参数,仅适配单一类型。 简单直接,但复用性差,需为不同类型重复定义。 仅需适配单一类型的场景(如仅处理数字的工具函数)。 typescript function addNumbers(a: number, b: number): number { return a + b; }
类型组合方式 联合类型(Union) 表示 “多个类型中的任意一个”,用 ` ` 连接。 扩大类型范围,允许变量取多种可能类型,适合 “或” 逻辑。 处理可能为 null/undefined 的值、参数支持多种类型(如 `string number`)。 ```typescript let value: string number; value = "abc"; // 合法 value = 123; // 合法 ```
交叉类型(Intersection) 表示 “同时满足多个类型”,用 & 连接,合并多个类型的属性 / 方法。 缩小类型范围,组合多个类型的特性,适合 “且” 逻辑。 合并对象类型(如合并用户信息与权限信息)、扩展已有类型。 typescript interface User { name: string } interface Admin { role: string } type AdminUser = User & Admin; // { name: string; role: string }
类型工具 内置工具类型(如 Partial) 基于已有类型动态生成新类型(由 TypeScript 内置,如 Partial/Pick/Omit)。 减少重复定义,通过逻辑推导生成新类型,提升灵活性。 快速生成衍生类型(如将接口属性变为可选、挑选部分属性)。 typescript interface User { name: string; age: number } type PartialUser = Partial<User>; // { name?: string; age?: number } type PickName = Pick<User, "name">; // { name: string }
自定义类型工具 开发者基于泛型、条件类型等手动实现的类型工具。 按需定制,满足业务特定的类型转换需求,灵活性更高。 业务专属的类型处理(如从 API 响应中提取数据类型、过滤无效字段)。 typescript type ExtractNumberProps<T> = { [K in keyof T]: T[K] extends number ? K : never }[keyof T]; // 提取对象中值为 number 的属性名
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐