// pick: 從類型 T 中選擇出屬性 K么库,構(gòu)造成一個新的類型购笆。
type MyPick<T, keys extends keyof T> = {
[K in keys]: T[K];
}
// Exclude: 從聯(lián)合類型 T中排除 U的類型成員剃浇,來構(gòu)造一個新的類型拢切。
type MyExclude<T, U> = T extends U ? never : T;
// Parameters: 內(nèi)置的 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;
// 數(shù)組轉(zhuǎn)對象: 傳入一個元組類型淮椰,將這個元組類型轉(zhuǎn)換為對象類型五慈,這個對象類型的鍵/值都是從元組中遍歷出來纳寂。
type Arr2Obj<T extends any[]> = {
[K in T[number]]: K;
}
// 獲取數(shù)組長度
type ArrLength<T extends readonly unknown[]> = T['length'];
// Includes: 實現(xiàn) JavaScript 的 Array.includes 方法
type Includes<T extends readonly unknown[], U> = U extends T[number] ? true : false;
// Concat: 實現(xiàn) JavaScript 的 Array.concat 方法,這個類型接受兩個參數(shù)泻拦,返回的新數(shù)組類型應(yīng)該按照輸入?yún)?shù)從左到右的順序合并為一個新的數(shù)組毙芜。
type Concat<T extends readonly unknown[], U extends readonly unknown[]> = [...T, ...U];
// Push: 實現(xiàn)通用的 Array.push
type Push<T extends readonly unknown[], U> = [...T, U];
// Readonly: 接收一個泛型參數(shù),并返回一個完全一樣的類型争拐,只是所有屬性都會被 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;
// 數(shù)組第一個元素
type First<T extends readonly unknown[]> = T[0] extends undefined ? never : T[0];