Pick 主要用于提取某种数据类型的属性
实际工作中,主要用来提取接口或 type 定义的对象类型中的属性
interface Book {
ISBN: string;
book_name: string;
book_price: number;
book_store_count: string; //库存数量
book_publish: string; // 出版社
}
//提取出3个属性
type Picktype = Pick<Book, "ISBN" | "book_name" | "book_price">;
let pickobj: Picktype = {
ISBN: "101-101",
book_name: "解放大西南",
book_price: 23.4,
};
Required + Partial + ReadOnly + Omit
interface Todo {
title: string;
completed: boolean;
description: string;
other?: string; //其他信息
date?: Date; // 日期
}
type RTodo = Required<Todo>; //一次性全部变成必选选项的type高级类型
type PTodo = Partial<Todo>;
// Partial和 Required 相反, 一次性全部变成可选选项
type ReadOnly<T> = {
readonly [P in keyof T]: T[P];
};
type ReadTodo = ReadOnly<Todo>;
// ReadOnly 一次性全部变成只读选项的type高级类型
// 剔除不要的属性
type OmitTodo = Omit<Todo, "description">;
这些内置方法,也可以自行手写
了解一个关键字 infer。 让我们拥有了给函数的参数定义类型变量的能力,infer 则是可以在 extends 之后的变量设置类型变量,更加细致地控制类型。
infer P 的意思就是泛型 T 是函数类型,并且这个函数类型的返回类型是 P
type Foo = () => CourseObj
// 如果T是一个函数,并且函数返回类型是P就返回P
type ReturnType1<T> = T extends ()=>infer P ?P:never
type Foo1 = ReturnType1<Foo>
type Partial1<T> = {
[K in keyof T]?:T[K] // 遍历T类型得到 key:value,都设为?可选
}
网友评论