Skip to content

高级类型

TypeScript 中的高级类型是指那些用于处理和操作类型本身的高级特性,它们允许开发者以更灵活、更强大的方式来定义和使用类型。以下是一些关键的高级类型概念:

  1. 映射类型(Mapped Types)

映射类型允许你根据现有类型创建新类型,通过对原类型中的每个属性应用某种转换。使用 key in T 语法和 [P in keyof T] 形式的映射。

ts
type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

interface Person {
  name: string;
  age: number;
}

type ReadonlyPerson = Readonly<Person>;
  1. 条件类型(Conditional Types)

条件类型使用 T extends U ? X : Y 形式,根据类型 T 是否能被赋值给 U,来从 X 或 Y 选择一个类型。

ts
type IsNever<T> = [T] extends [never] ? true : false;

type Result = IsNever<never>; // true
type Result2 = IsNever<string>; // false
  1. 索引类型查询(Indexed Access Types)

索引类型查询允许你从一个索引签名中获取类型,形式为 T[K],其中 T 是一个对象类型,K 是该对象的键的类型。

ts
interface User {
  name: string;
  age: number;
}

type NameType = User["name"]; // string
  1. 交叉类型(Intersection Types)

交叉类型通过 & 符号组合多个类型,得到的类型拥有所有输入类型的属性和方法。

ts
type Developer = {
  name: string;
  skill: string;
};

type Employee = {
  id: number;
};

type FullTimeDeveloper = Developer & Employee;
  1. 联合类型(Union Types)

联合类型通过 | 符号表示一个值可以是多个类型中的任意一个。

ts
type ID = number | string;
function getID(id: ID) {
  // ...
}
  1. 类型保护(Type Guards)

类型保护是用于运行时检查值的类型,并在编译时影响类型推断的表达式。这可以是类型谓词函数、instanceof、in 操作符等。

ts
function isString(value: any): value is string {
  return typeof value === "string";
}

function example(value: string | number) {
  if (isString(value)) {
    // 在这个分支里,TypeScript 知道 value 是 string 类型
    console.log(value.toUpperCase());
  } else {
    // 这里 value 是 number 类型
    console.log(value.toFixed(2));
  }
}
  1. 类型别名(Type Aliases)

虽然不是严格意义上的“高级类型”,但类型别名提供了一种命名复杂类型的方式,便于复用和理解。

ts
type Coordinate = {
  x: number;
  y: number;
};

Released under the MIT License.