// pick: 从类型 T 中选择出属性 K,构造成一个新的类型。
type MyPick<T, keys extends keyof T> = {
[K in keys]: T[K];
}
// Exclude: 从联合类型 T中排除 U的类型成员,来构造一个新的类型。
type MyExclude<T, U> = T extends U ? never : T;
// Parameters: 内置的 Parameters 类型
type MyParameters<T> = T extends (...args: infer U) => any ? U : never;
// Awaited: 有一个 Promise 对象,这个 Promise 对象会返回一个类型, 获取这个类型。
type MyAwaited<T> = T extends Promise<infer U> ? MyAwaited<U> : T;
// 数组转对象: 传入一个元组类型,将这个元组类型转换为对象类型,这个对象类型的键/值都是从元组中遍历出来。
type Arr2Obj<T extends any[]> = {
[K in T[number]]: K;
}
// 获取数组长度
type ArrLength<T extends readonly unknown[]> = T['length'];
// Includes: 实现 JavaScript 的 Array.includes 方法
type Includes<T extends readonly unknown[], U> = U extends T[number] ? true : false;
// Concat: 实现 JavaScript 的 Array.concat 方法,这个类型接受两个参数,返回的新数组类型应该按照输入参数从左到右的顺序合并为一个新的数组。
type Concat<T extends readonly unknown[], U extends readonly unknown[]> = [...T, ...U];
// Push: 实现通用的 Array.push
type Push<T extends readonly unknown[], U> = [...T, U];
// Readonly: 接收一个泛型参数,并返回一个完全一样的类型,只是所有属性都会被 readonly 所修饰。
type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
}
// IF: 接收一个条件类型 T ,一个判断为真时的返回类型 P ,以及一个判断为假时的返回类型 U。
type If<T extends boolean, P, U> = T extends true ? P : U;
// 数组第一个元素
type First<T extends readonly unknown[]> = T[0] extends undefined ? never : T[0];