TypeScript要想玩的6,实用工具类型必须知(一)

93 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

很多初学者在学习TypeScirpt这门语言都非常的吃了,学习了基本的接口、泛型、联合类型、元组等等一系列关于TypeScript知识。

但是在实际开发中去定义类型又非常不熟练,并且又有一种约束的感觉。总的来说对开发体验感极差从而导致对TypeScript这一门语言产生厌恶或者恐惧,从而 any 一把梭。

实际上,学习TypeScript并非一件容易的事,它是一个类型世界。我自己在初学TypeScirpt时也是产生这种恐惧的感觉,并没有给我的开发带来便利的感觉。到后面用多了才明白它的好。

TypeScript 工具类型

接下来主要是介绍一下 TypeScript 提供给我们的一些工具类型。

这些工具类型可以帮助我们在开发中对类型进行一系列的类型转换,接下来就先介绍前五个工具类型。

Partial<Type>

Partial<Type> 构造一个将Type类型中的所有属性变成可选属性

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TestPartialType = Partial<Todo>

// 转换为如下类型
type TestPartialType = {
    title?: string | undefined;
    description?: string | undefined;
    completed?: boolean | undefined;
}

实现源码:

// keyof T 获取类型T的所有Key组成一个联合类型
type CustomPartialType<T> = {
  [K in keyof T]?: T[K];
};

Required<Type>

Required<Type> 构造一个将Type类型中的所有属性变成必须属性

interface Todo {
  title?: string;
  description: string;
  completed?: boolean;
}

type TestRequiredType = Required<Todo>

// 转换为如下类型
type TestRequiredType = {
  title: string;
  description: string;
  completed: boolean;
}

实现源码:

type CustomRequiredType<T> = {
  [K in keyof T]-?: T[K];
};

Readonly<Type>

Readonly<Type> 构造一个将Type类型中所有属性是只读属性的类型

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TestReadonlyType = Readonly<Todo>;

// 转换为如下类型
type TestReadonlyType = {
    readonly title: string;
    readonly description: string;
    readonly completed: boolean;
}

实现源码:

type CustomReadonlyType<T> = {
  readonly [K in keyof T]: T[K];
};

Record<Keys, Type>

Record<Keys, Type> 构造一个对象类型,属性键为Keys,属性值为Type

interface CatInfo {
  age: number;
  breed: string;
}
type CatName = "miffy" | "boris" | "mordred";

type TestRecordType = RecordType<CatName, CatInfo>;

// 转换为如下类型
type TestRecordType = {
    miffy: CatInfo;
    boris: CatInfo;
    mordred: CatInfo;
}

实现源码:

type CustomRecordType<K extends keyof any, V> = {
  [P in K]: V;
};

Pick<Type, Keys>

Pick<Type, Keys> 从Type选择一组属性,来构造一个新的类型

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TestPickType = Pick<Todo, "title" | "description">;

// 转换为如下类型
type TestPickType = {
    title: string;
    description: string;
}

实现源码:

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

总结

巧用TypeScript提供的工具类型可以帮助我们灵活的进行类型转换。要想进一步学好TypeScirpt学会熟悉使用这些工具类型是必备的。

快一起学起来吧,祝各位早日成为类型定义大师,告别一把梭!!!