// Omit: 實(shí)現(xiàn) TypeScript 的 Omit<T, K> 泛型
type MyOmit<T, U extends keyof T> = {
[K in Exclude<keyof T, U>]: T[K];
}
// Readonly: K指定應(yīng)設(shè)置為 Readonly的T的屬性集。如果未提供K,則應(yīng)使所有屬性都變?yōu)橹蛔x
type MyReadonly<T, U extends keyof T> = Omit<T, U> & Readonly<Pick<T, U>>;
// DeepReadonly: 將對象的每個(gè)參數(shù)及其子對象遞歸地設(shè)為只讀(對象)
type DeepReadonly<T> = {
readonly [K in keyof T]: keyof T[K] extends never ? T[K] : DeepReadonly<T[K]>;
}
// PromiseAll: 它接受PromiseLike對象數(shù)組,返回值應(yīng)為Promise<T>懦铺,其中T是解析的結(jié)果數(shù)組。
declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<{
[K in keyof T]: Awaited<T[K]>;
}>;
// TrimLeft: 接收確定的字符串類型并返回一個(gè)新的字符串,其中新返回的字符串刪除了原字符串開頭的空白字符串揽浙。
type TrimLeft<T extends string> = T extends `${' ' | '\t' | '\n'}${infer U}` ? TrimLeft<U> : T;
// Trim
type Trim<T extends string> = T extends `${infer U}${' ' | '\t' | '\n'}` ? Trim<U> : TrimLeft<T>;
// Last: 它接受一個(gè)數(shù)組T并返回其最后一個(gè)元素的類型
type Last<T extends any[]> = T extends [...infer R, infer L] ? L : never;
// Pop: 它接受一個(gè)數(shù)組T,并返回一個(gè)由數(shù)組T的前l(fā)ength-1項(xiàng)以相同的順序組成的數(shù)組意敛。
type Pop<T extends any[]> = T extends [...infer R, infer L] ? R : [];
// Chainable: 可串聯(lián)馅巷,其中兩個(gè)函數(shù) option(key, value) 和 get()
type Chainable<T> = {
option<K extends string, U>(key: K, value: U): Chainable<T & Record<K, U>>;
get(): T
}
// ReturnType: typeScript 的 ReturnType<T> 泛型。
type MyReturnType<T extends Function> = T extends (...args: any[]) => infer U ? U : never;
// TupleToUnion: 實(shí)現(xiàn)泛型 TupleToUnion<T>空闲,它返回元組所有值的合集令杈。
type TupleToUnion<T extends readonly unknown[]> = T[number];
// LookUp: 在聯(lián)合類型 Cat | Dog中搜索公共type字段來獲取相應(yīng)的類型
type LookUp<U, T> = U extends { type: T } ? U : never;
interface Cat {
type: 'cat'
breeds: 'Abyssinian' | 'Shorthair' | 'Curl' | 'Bengal'
}
interface Dog {
type: 'dog'
breeds: 'Hound' | 'Brittany' | 'Bulldog' | 'Boxer'
color: 'brown' | 'white' | 'black'
}
type MyDog = LookUp<Cat | Dog, 'dog'> // expected to be `Dog`