# type-challenges
# 4・Pick
type MyPick<T, K extends keyof T> = {
[P in K]:T[P]
}
# 7・Readonly
type MyReadonly<T> = {
readonly [K in keyof T]:T[K]
}
# 11・Tuple to Object 🤓
type TupleToObject<T extends readonly any[]> = {
[P in T[number]]:P
}
# 14・First of Array
type First<T extends any[]> = T extends [first:infer U,...args:any] ? U:never;
# 18・Length of Tuple 🤓
// 基于infer
type Length<T extends any> = T extends {length:infer U}?U:never;
// 基于索引访问
type Length<T extends any> = T extends {length:number}?T['length']:never;
# 43・Exclude
type MyExclude<T , U > = T extends U?never:T;
# 189・Awaited
type Awaited<T extends Promise<any>> =
T extends Promise<infer U>?
U extends Promise<any>?
Awaited<U>:U
:never
# 268・If
type If<C extends boolean, T, F> = C extends true?T:F
# 533・Concat 🤓
type Concat<T extends any[], U extends any[]> = [
...T,
...U
]
# 898・Includes
type isAny<T> = 0 extends (1&T)?true:false;
// 前半部分都是处理any的情况
type MqEqual<A, B> = isAny<A> extends true?
isAny<B> extends true?
true:false
: isAny<B> extends true ? false:
// 到这里没有any了 那么就是可以互相作为子类
// 要用非分布式类型 分布式类型处理不了never
[A] extends [B] ?
[B] extends [A]
? true: false
:false
// 映射成新的数组 其值表示是否相等
// {
// [K in keyof T]:MqEqual<T[K],U> extends true?true:false;
//}
// 然后[number] 拿到把元素合并 这时可能会出现 true false boolean 三种情况
// 然后 true extends 判断是否有相等的
type Includes<T extends readonly any[], U> = true extends {
[K in keyof T]:MqEqual<T[K],U> extends true?true:false;
}[number] ? true:false
# 3057・Push
type Push<T extends any[], U> = [...T,U]
# 3060・Unshift
type Unshift<T extends any[], U> = [U,...T]
# 3312・Parameters
type MyParameters<T extends (...args: any[]) => any> = T extends (...args:infer U)=>any?U:never