Pick
type MyPick<T, K extends keyof T> = { [entry in K]: T[entry] }
K를 T의 키 집합의 부분집합으로 좁히고 해당 키와 타입을 새로운 오브젝트 타입.
Readonly
type MyReadonly<T> = { readonly [K in keyof T]: T[K] }
T의 키 집합에 대해 readonly를 적용한다. 이때 T[K]은 readonly의 대상이 아니기 때문에 DeepReadonly가 아니다.
Tuple to Object
type TupleToObject<T extends readonly any[]> = { [P in T[number]]: P }
readonly 배열(readonly any[]) 타입으로 한정된 T타입의 모든 배열 요소들(T[number])를 key와 value로 갖는 오브젝트 타입.
First of Array
const empty: never[] = [] // OK
type First<T extends any[]> = T extends never[] ? never : T[0]
T가 빈 배열일 경우 never, 그 외엔 배열 타입의 첫 번째 요소의 타입을 반환하는 오브젝트 타입.
Length of Tuple
type Length<T extends readonly any[]> = T["length"];
readonly 배열의 부분집합 T타입의 length 값을 타입으로 가지는 오브젝트 타입.
Exclude
type MyExclude<T, U> = T extends U ? never : T
키 리터럴인 U의 부분집합에 속하는 T타입을 never로 정하고 그 외엔 그대로 유지하는 오브젝트 타입. never로 지정된 키에 대입이 불가능하기 때문에 기존 타입에서 지정한 키들을 exclude 한 효과
Awaited
type MyAwaited<T> =
T extends Promise<infer R>
? R extends Promise<any>
? MyAwaited<R>
: R
: T
infer 키워드로 제네릭의 타입 추론 후, 중첩된 Promise가 아닌 경우 추론된 타입을 사용하지만 추론된 제너릭 타입이 또다시 Promise인 경우 재귀적으로 타입 분해 수행 후 오브젝트 타입 정의.
IF
type If<C extends boolean, T, F> = C extends true ? T : F
Concat
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
배열 타입의 부분 집합 T, U의 연결된 오브젝트 타입.
Includes
type Includes<T extends readonly any[], U> =
T extends [infer R, ...infer W]
? Equal<R, U> extends true
? true
: Includes<W, U>
: false;
배열 타입의 부분집합인 T의 요소를 줄여가면서 첫 번째 요소와 U를 비교해 포함 여부를 추론하는 오브젝트 타입.
Push
type Push<T extends unknown[], U> = [...T, U]
배열 타입의 부분집합 T의 마지막 요소에 U타입을 추가한 오브젝트 타입.
Unshift
type Unshift<T extends unknown[], U> = [U, ...T]
배열 타입의 부분집합 T의 첫 번째 요소에 U타입을 추가한 오브젝트 타입.
Parameters
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? P : never
infer 키워드를 사용해 추론된 매개변수 타입을 가진 오브젝트 타입.
'메모' 카테고리의 다른 글
Type<Challenge[]> #Medium (0) | 2022.02.05 |
---|---|
Node.js 플랫폼 (0) | 2022.02.04 |
Typescript로 구현한 Linked list (0) | 2022.02.01 |
JS의 메모리관리 (0) | 2022.01.13 |
Generator (0) | 2022.01.01 |