TypeScript整理

62 阅读1分钟
any和unknown的区别
  • any和unknown都是顶级类型。
  • 任何类型都能赋值给any、unknown类型。
  • any类型能赋值给任何类型,unknown类型只能赋值给any和unknown类型。
  • any类型的值能执行任何操作(例:value.trim()、new value()),unknown不行:不再被认为是类型正确。
object, Object 和 {} 类型区别
  • object表示非原始类型(除了string、boolean、number、bigint、symbol、null、undefined之外的类型)。
  • Object是所有 Object 类的实例的类型,Object 接口定义了 Object.prototype 原型对象上的属性。
  • {} 描述了一个没有成员的对象。
type和interface的区别
  • type可以定义联合类型、基础类型别名、元组类型,interface不行。
  • type名称重复是非法的,interface名称重复会合并。
  • type和interface可以相互继承,type继承使用 & (交叉类型);interface继承使用extends。
any、unknown、never的联合和交叉
  • any和任何类型联合都是any,any和任何非never类型交叉都是any。
  • unknown和任何非any类型联合都是unknown,unknown和其他类型交叉都是其他类型。
  • never和其他类型联合都是其他类型,unknown和其他类型交叉都是never。
常用工具类及实现
type Partial<T> = {
    [P in keyof T]?: T[P] | undefined;
}

type Required<T> = {
    [P in keyof T]-?: T[P];
}

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

type Record<K extends string | number | symbol, T> = {
    [P in K]: T;
}

type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
}

type Exclude<T, U>=T extends U ? never : T   //作用是将某个类型中属于另一个的类型移除掉。

type Extract<T, U>=T extends U ? T : never   //作用是从 T 中提取出 U。

type Omit<T, K extends string | number | symbol> = {
    [P in Exclude<keyof T ,K>]: T[P];
}

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any

type Parameters<T extends (...args :any) => any> = T extends (...args: infer P) => any ? P : never