文档(来自 TypeScript 官方文档的“高级类型”章节),以下是从文档中提取的所有明确提到的 TypeScript 高级类型及其相关概念的列表。这些类型和机制是 TypeScript 类型系统的核心部分,用于处理复杂的类型操作和场景。以下是完整的类型列表,并附带简要说明:
1. 交叉类型(Intersection Types)
- 定义:将多个类型合并为一个类型,包含所有类型的特性。使用
&操作符。 - 语法:
T & U - 示例:
type Combined = Person & Serializable & Loggable; - 用途:常用于混入(mixins)或合并多个类型的属性和方法。
- 示例代码:
function extend<T, U>(first: T, second: U): T & U;
2. 联合类型(Union Types)
- 定义:表示一个值可以是几种类型之一,使用
|操作符分隔类型。 - 语法:
T | U - 示例:
type StringOrNumber = string | number; - 用途:适合值可能是多种类型之一的场景,只能访问所有类型共有的成员。
- 示例代码:
function padLeft(value: string, padding: string | number);
3. 类型保护(Type Guards)
- 定义:通过运行时检查(如
typeof、instanceof或自定义类型谓词)缩小联合类型的范围。 - 种类:
- typeof 类型保护:检查基本类型(如
"number"、"string"、"boolean"、"symbol")。if (typeof padding === "number") { ... } - instanceof 类型保护:通过构造函数检查对象的类型。
if (padder instanceof SpaceRepeatingPadder) { ... } - 用户自定义类型保护:通过返回类型谓词(
parameterName is Type)定义。function isFish(pet: Fish | Bird): pet is Fish { return (<Fish>pet).swim !== undefined; }
- typeof 类型保护:检查基本类型(如
- 用途:在联合类型中明确值的具体类型,以便安全访问特定类型的成员。
4. 可以为 null 的类型(Nullable Types)
- 定义:通过联合类型显式包含
null或undefined,通常结合--strictNullChecks使用。 - 示例:
let sn: string | null = "bar"; - 用途:在启用
--strictNullChecks时,防止null或undefined意外赋值。 - 相关特性:
- 可选参数和可选属性:自动包含
| undefined。function f(x: number, y?: number); - 类型断言去除 null/undefined:使用
!非空断言操作符。name!.charAt(0);
- 可选参数和可选属性:自动包含
5. 类型别名(Type Aliases)
- 定义:为任意类型(包括原始类型、联合类型、元组等)起一个新名字。
- 语法:
type Name = string; type NameOrResolver = Name | NameResolver; - 特点:
- 不创建新类型,只是引用现有类型。
- 支持泛型:
type Container<T> = { value: T }; - 可用于递归类型:
type Tree<T> = { value: T; left: Tree<T>; right: Tree<T> }; - 不能用于
extends或implements,与接口有区别。
- 用途:定义复杂类型、联合类型、元组等,适合不适合用接口描述的场景。
6. 字符串字面量类型(String Literal Types)
- 定义:指定字符串必须是固定值。
- 示例:
type Easing = "ease-in" | "ease-out" | "ease-in-out"; - 用途:
- 结合联合类型和类型保护,模拟枚举行为。
- 用于函数重载:
function createElement(tagName: "img"): HTMLImageElement; function createElement(tagName: "input"): HTMLInputElement;
7. 数字字面量类型(Numeric Literal Types)
- 定义:指定数字必须是固定值。
- 示例:
function rollDie(): 1 | 2 | 3 | 4 | 5 | 6; - 用途:限制返回值或参数为特定数字,常用于调试或缩小范围。
8. 枚举成员类型(Enum Member Types)
- 定义:当枚举成员使用字面量初始化时,每个成员具有特定的单例类型。
- 示例:
enum Color { Red = "RED", Green = "GREEN" } let c: Color.Red; // 类型为字面量 "RED" - 用途:提供单例类型,结合联合类型使用,增强类型安全性。
9. 可辨识联合(Discriminated Unions)
- 定义:结合单例类型、联合类型和类型保护,通过一个可辨识的特征(通常是字符串字面量属性)区分联合类型的成员。
- 要素:
- 具有单例类型属性的“标签”(如
kind: "square")。 - 包含联合类型的类型别名。
- 使用类型保护(如
switch或类型谓词)。
- 具有单例类型属性的“标签”(如
- 示例:
interface Square { kind: "square"; size: number; } interface Rectangle { kind: "rectangle"; width: number; height: number; } type Shape = Square | Rectangle | Circle; function area(s: Shape) { switch (s.kind) { case "square": return s.size * s.size; case "rectangle": return s.height * s.width; } } - 用途:在函数式编程中模拟代数数据类型,确保类型安全和完整性检查。
10. 多态的 this 类型(Polymorphic this Types)
- 定义:表示某个类或接口的子类型,常用于链式调用(F-bounded 多态性)。
- 示例:
class BasicCalculator { public add(operand: number): this { ... } } class ScientificCalculator extends BasicCalculator { public sin(): this { ... } } - 用途:支持方法链式调用,确保返回类型是当前类的类型,而不是父类。
11. 索引类型(Index Types)
- 定义:用于处理动态属性名的类型操作。
- 操作符:
- 索引类型查询(keyof T):获取类型
T的所有公共属性名的联合类型。let personProps: keyof Person; // "name" | "age" - 索引访问操作符(T[K]):获取类型
T在键K处的属性类型。let name: Person["name"]; // string
- 索引类型查询(keyof T):获取类型
- 示例:
function getProperty<T, K extends keyof T>(o: T, name: K): T[K]; - 用途:动态访问对象属性,确保类型安全。
12. 索引签名(Index Signatures)
- 定义:允许对象以任意字符串或数字作为键,定义动态属性的类型。
- 示例:
interface Map<T> { [key: string]: T; } let keys: keyof Map<number>; // string let value: Map<number>["foo"]; // number - 用途:处理动态键名的对象,结合
keyof和T[K]使用。
13. 映射类型(Mapped Types)
- 定义:基于现有类型的键(
keyof T)动态生成新类型,修改属性修饰符或类型。 - 语法:
type Readonly<T> = { readonly [P in keyof T]: T[P] }; type Partial<T> = { [P in keyof T]?: T[P] }; - 常见映射类型:
Readonly<T>:将所有属性设为只读。Partial<T>:将所有属性设为可选。Pick<T, K>:选取T的部分属性。Record<K, T>:创建以K为键、值为T的对象类型。
- 示例:
type Nullable<T> = { [P in keyof T]: T[P] | null }; - 用途:批量转换类型属性,创建通用工具类型。
14. 由映射类型进行推断
- 定义:从映射类型(如
Proxify<T>)推断出原始类型。 - 示例:
type Proxify<T> = { [P in keyof T]: Proxy<T[P]> }; function unproxify<T>(t: Proxify<T>): T; - 用途:拆包映射类型,恢复原始类型,适用于同态映射类型。
15. never 类型(用于完整性检查)
- 定义:表示不可能的值,常用于完整性检查或类型推断。
- 示例:
function assertNever(x: never): never { throw new Error("Unexpected object: " + x); } - 用途:结合可辨识联合,确保所有分支被处理,捕获遗漏的 case。
总结
以下是从文档中提取的所有高级类型和相关概念的列表:
- 交叉类型(Intersection Types)
- 联合类型(Union Types)
- 类型保护(Type Guards)
- typeof 类型保护
- instanceof 类型保护
- 用户自定义类型保护(类型谓词)
- 可以为 null 的类型(Nullable Types)
- 可选参数和可选属性
- 非空断言(
!)
- 类型别名(Type Aliases)
- 字符串字面量类型(String Literal Types)
- 数字字面量类型(Numeric Literal Types)
- 枚举成员类型(Enum Member Types)
- 可辨识联合(Discriminated Unions)
- 多态的 this 类型(Polymorphic this Types)
- 索引类型(Index Types)
- 索引类型查询(
keyof T) - 索引访问操作符(
T[K])
- 索引类型查询(
- 索引签名(Index Signatures)
- 映射类型(Mapped Types)
- Readonly
- Partial
- Pick<T, K>
- Record<K, T>
- 由映射类型进行推断
- never 类型
这些类型和机制共同构成了 TypeScript 强大的类型系统,支持复杂场景下的类型安全和代码复用。如果需要对某个具体类型深入探讨或查看更多示例,请告诉我!