Better

Ethan的博客,欢迎访问交流

Typescript 工具类型

最近无疑间发现 Typescript 提供的实用工具类型,解决了之前开发中碰到的困惑,于是今日将这一块知识全面补充的一下。

typeof and keyof

这两个和后面其他的不太一样,但也十分重要且常用。

typeof 在 JavaScript 中也是存在的,但你在 TypeScript 中也是存在的,不知道你看见的时候有没有困惑过。哪他们的区别是什么呢

  • typeof 在 JavaScript 用来识别变量的类型,注意是运行时类型,是无法获取 TypeScript 声明的编译时类型
  • typeof 在 TypeScript 可以在编译期间执行

下面看看 typeof 的例子

const a = { foo: 0 };
const b: Array<typeof a> = [{ foo: 1 }, { foo: 2 }, {foo: 3}];
const c: string = typeof a; // "object"

keyof 与 Object.keys 略有相似,只不过 keyof 取 interface 的键。下面看一个例子

enum ColorsEnum {
    white = '#ffffff',
    black = '#000000',
}
type Colors = keyof typeof ColorsEnum;

有没有思考为啥要 keyof 接着 typeof 呢。原因是:keyof 取的是类型的 key 值,但 enum 其实创建的是实例了,因此需要先使用 typeof 获得对应的类型

Partial

Partial 翻译过来表示部分的意思,表示 T 中所有的类型都是可选的。这个属性太酷了,假设你的需要是,通过传递对象的一部分,比如 userPatch,来更新 user 数据,这时候就可以排上用处的,如果不知道这个函数,你可能就需要使用到 any 了

举个例子

function updateUser(user: User, fieldsToUpdate: Partial<User>) {
  return { ...user, ...fieldsToUpdate };
}

哇塞是不是很酷,感觉自己的 typescript 功底都不一样了,哈哈

Readonly

这个就比较简单了,表明类型 T 的所有属性都只是可读的,不能被重新赋值

Record<K,T>

这个稍微复杂点,将 K 的所有属性,类型声明为 T。

Pick<T,K>

这个很实用,从 T 中取出 K 声明的属性,例子如下

type TodoPreview = Pick<Todo, "title" | "completed">;

Omit<T,K>

和 Pick 相反,从 T 中排除 K 声明的属性

type TodoPreview = Omit<Todo, "description">;

Exclude<T,U>

从 T 中排除 U 中声明的属性

Extract<T,U>

从 T 中提取 U 中声明的属性

NonNullable

算是 Exclude 的特殊版,从 T 中排除 null 和 undefined

Parameters

T 只能是一个函数,该工具用来得到函数的参数类型

declare function f1(arg: { a: number; b: string }): void;
type T0 = Parameters<() => string>; // []
type T1 = Parameters<(s: string) => void>; // [string]
type T4 = Parameters<typeof f1>; // [{ a: number, b: string }]

ConstructorParameters

获取构造函数的参数类型

ReturnType

函数 T 返回结果作为类型

declare function f1(): { a: number; b: string };
type T0 = ReturnType<() => string>; // string
type T1 = ReturnType<(s: string) => void>; // void
type T4 = ReturnType<typeof f1>; // { a: number, b: string }

InstanceType

通常你可能并不需要用到这个工具,因为如果是普通的类,你直接使用 Class Name 即可。

当你由于某些原因,你不知道该类的声明时,比如如下两种情况,会很有帮助。具体见Need documentation for InstanceType

Required

将 T 的所有属性设置为必须,即使本身可能是 ? 可选

其他

这几个说实话,看不太懂哇

  • ThisParameterType
  • OmitThisParameter
  • ThisType


留言