holdanddeepdive / typescript-study

4 stars 0 forks source link

[3์ฃผ์ฐจ] Medium 2, 3, 8, 9, 10 #6

Open Choozii opened 1 year ago

Choozii commented 1 year ago

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

2. Get Return Type โœ…

Implement the built-in ReturnType generic without using it.

type MyReturnType<T extends (arg: any, ...args: any) => any> = T extends (arg: any, ...args: any) => infer R ? R : unknown

3. Omit ๐Ÿ‘€

Implement the built-in Omit<T, K> generic without using it. Constructs a type by picking all properties from T and then removing K

type MyOmit<T, K extends keyof T> = {[P in keyof T extends K? never: P]: T[P]}
// ์ฐพ์•„๋ณธ ์ •๋‹ต
type MyOmit<T, K extends keyof T> = {[P in keyof T as P extends K? never: P]: T[P]}
// tslib
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

8. Readonly 2 ๐Ÿ‘€

Implement a generic MyReadonly2<T, K> which takes two type argument T and K. K specify the set of properties of T that should set to Readonly. When K is not provided, it should make all properties readonly just like the normal Readonly.

// ๋‚ด ๋‹ต -> error ์žˆ์Œ (omit์„ ์ด์šฉํ•ด๋ดค์œผ๋‚˜...)
type MyReadonly2<T, K extends keyof T> = { readonly [P in K]: T[P] } & { [P in keyof T as P extends K ? never: P]: T[P]}
// ๋‹ต์ด ๋˜๋ ค๋ฉด
type MyReadonly2<T, K extends keyof T = keyof T> = { readonly [P in K]: T[P] } & { [P in keyof T as P extends K ? never: P]: T[P]}
// = keyof T๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค

9. Deep Readonly๐Ÿ‘€

Implement a generic DeepReadonly which make every parameter of an object - and its sub-objects recursively - readonly.

type DeepReadonly<T> = {
  readonly [P in keyof T]: keyof T[P] extends never ? T[P] : DeepReadonly<T[P]>
}

10. Tuple to Union โœ…

type TupleToUnion<T extends any[]> = T[number]