holdanddeepdive / typescript-study

4 stars 0 forks source link

[2주차] Easy 풀이 #2

Open sbyeol3 opened 1 year ago

sbyeol3 commented 1 year ago

https://github.com/type-challenges/type-challenges/blob/main/README.md

4 - Pick

type MyPick<T, K extends keyof T> = {[x in K]: T[x]}

7 - Readonly

// type MyReadonly<T> = Readonly<T>

type MyReadonly<T> = {
  readonly [x in keyof T]: T[x]
}

11 -Tuple to Object

type TupleToObject<T extends readonly any[]> = { [x in T[number]]: x}

14 - First of Array

type First<T extends any[]> = T extends [infer E, ...unknown[]] ? E : never

18 - Length of Tuple

// type Length<T extends readonly any[]> =
// 여기까지만 하다가 length를 아는 법 서치하다가 알게 됨
type Length<T extends readonly any[]> = T['length']

43 - Exclude 🤔

type MyExclude<T, U> =  T extends U ? never : T;

189 - Awaited 🤔

tslib 참고

/**
* Recursively unwraps the "awaited type" of a type. Non-promise "thenables" should resolve to `never`. This emulates the behavior of `await`.
*/
type Awaited<T> =
T extends null | undefined ? T : // special case for `null | undefined` when not in `--strictNullChecks` mode
T extends object & { then(onfulfilled: infer F, ...args: infer _): any } ? // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped
F extends ((value: infer V, ...args: infer _) => any) ? // if the argument to `then` is callable, extracts the first argument
Awaited<V> : // recursively unwrap the value
never : // the argument to `then` was not callable
T; // non-object or non-thenable

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 Includes<T extends readonly any[], U> = U extends T[number] ? true : false
// 일부 케이스에서 error

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 A) => any ? A : never