携手创作,共同成长!这是我参与「掘金日新计划 · 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学会熟悉使用这些工具类型是必备的。
快一起学起来吧,祝各位早日成为类型定义大师,告别一把梭!!!