Skip to content
大纲

高级类型

交叉类型

交叉类型是将多个类型合并为一个类型,包含了所需的所有类型的特性。

示例

ts
function test<T, U>(a: T, b: U): T & U {
  return Object.assign({}, a, b);
}

联合类型

  • 联合类型表示一个值可以是几种类型中的一个
  • 若一个值是联合类型,则只能访问该联合类型所有类型的共有成员

示例

ts
function getSeven(type: "string" | "number"): number | string {
  if (type === "string") return "7";
  if (type === "number") return 7;
  throw new Error("unhandled type: " + type);
}
const seven = getSeven("number");
// console.log(seven - 7) //[ts] 算术运算左侧必须是 "any"、"number" 或枚举类型

类型别名

类型别名即对给定的类型起别名,通常用于字面量、元组、联合类型

  • 基本格式 type TypeName = Type
  • 类型别名可以是泛型(TODO:)
  • 类型别名中可以引用自身(TODO:)

示例

ts
type Validator = (arg: any) => boolean;

字符串字面量类型

固定的字符串也可以作为类型使用,通常与联合类型、类型别名结合使用

示例

ts
type State = "open" | "close";

数字字面量类型

固定的数字也可以作为类型使用,一般很少使用

示例

ts
type Top = 1 | 2 | 3;

索引类型

索引类型用于检测对象的属性

  • 索引类型查询操作符: keyof T ,表示 T 类型上已知的公共属性名的联合
  • 索引访问操作符: T[K] (这里 KT 类型上的属性名),用于访问 T 类型上 K 属性的类型
  • keyof T 类型被认为是 string 的子类型

示例

ts
type Key<T> = keyof T;
class P {
  label: string;
  value: boolean;
}
let label: Key<P> = "label";
let value: P["value"] = false;

映射类型

映射类型用于对原类型的属性进行映射和转换以实现新类的类型结构

  • 使用 K in T 的格式获取 T 中的属性
  • 使用 K in keyof T 的格式获取 T 中的属性

内置的映射类型: Partial, Readonly, Record, Pick

ts
// 用于映射一个接口的子集接口
type Partial<T> = {
  [P in keyof T]?: T[P];
};

// FIXME: 新增的
type Required<T> = {
  [P in keyof T]-?: T[P];
};

// 用于映射一个接口的只读接口
type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

// 用于映射一个接口子集接口,与 Partial 不同的是该映射需要指定属性名
type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

// 用于映射一个接口中属性的类型转换为另一个类型
type Record<K extends keyof any, T> = {
  [P in K]: T;
};