일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- javascript
- 프로그래머스 레벨 2
- TCP
- BFS
- type challenge
- 크롤링
- 가천대
- HTTP
- 타입스크립트
- Node.js
- dfs
- typescript
- 프로그래머스
- 백준
- socket
- Nestjs
- 쉬운 문제
- Crawling
- 문자열
- 소켓
- Algorithm
- ip
- 알고리즘
- HTTP 완벽 가이드
- 그래프
- 자바스크립트
- 타입 챌린지
- 레벨 1
- 수학
- dp
- Today
- Total
kakasoo
Omit type 정의하기 & Type level에서 as문 사용하기 본문
interface Person {
body: number;
mind: boolean;
soul: boolean;
}
type Zombie = MyOmit<Person, mind | soul>; // type Zombie = { body: number };
Person에서 mind | soul을 제외하면 body만 남는 걸 Zombie라고 정의할 수 있다고 해보자.
MyOmit은 방금 한 말을 타입으로 정의하는 방법으로, TypeScript에서 Utility type으로 이미 정의된 Omit과 동일하다.
Omit 타입을 구현하려면 아래처럼 사고를 확장해나가면 된다.
type MyOmit<T,K> = any;
가장 먼저 이 타입은 두 개의 타입 파라미터를 받는다고 정의할 수 있다.
type MyOmit<T, K extends keyof T> = any;
K는 무조건 T라는 타입 안에 정의된 프로퍼티들로만 구성되어 있어야 하기 때문에 K extends keyof T가 성립한다.
애초에 정의가 되어 있지 않다면 제외할 필요도 없이, 이미 없을 것이기 때문에, 존재하는 프로퍼티로만 구성되어야 한다.
따라서 keyof 연산자가 필요했다.
type MyOmit<T, K extends keyof T> = {
[key in keyof T]: T[key];
};
다음 정의는, T에 있는 모든 키 ( = key ) 로 이루어져 있으며, 그 키에 대한 타입은 T[key]로 되어 있는 타입이다.
이 타입은 이미 T와 같다.
이제 이 타입에서 K와 일치하는 것들만 제거해주면 된다.
따라서, as문으로 타입 단언을 해줄 것인데, 아래와 같이, 필요없는 타입들을 걸러내주면 된다.
type MyOmit<T, K extends keyof T> = {
[key in keyof T as key extends K ? never: key]: T[key];
};
key in keyof T는, as 즉 우측의 식과 동일하다.
우측의 식은 key extends K ? never: key 인데, key가 K에 포함된다면 제외해야 하므로 never이고 아니면 그대로 key를 반환한다.
never가 key인 값은 존재하지 않기 때문에 키의 타입이 무엇이든지 관계없이 T에서 제외됨을 의미한다.
즉 key는 T에서 K에 포함된 것들을 제외한 나머지 프로퍼티 이름을 의미한다.
type MyOmit<T, K extends keyof T> = {
[key in Exclude<keyof T, K>]: T[key];
}
이미 정의된 Exclude를 사용한다면 이렇게도 설명할 수 있다.
Exclude는 어떻게 정의할 수 있을까?
'프로그래밍 > TypeScript' 카테고리의 다른 글
Readonly type 구현 (0) | 2023.02.15 |
---|---|
infer R 타입을 이용한 GetReturnType (0) | 2023.02.12 |
타입 레벨에서 포함 관계를 검사하는 Includes 타입 구현하기 (0) | 2023.02.09 |
배열의 첫 번째 값을 가리키는 타입 (0) | 2023.02.07 |
Exclude은 왜 T extends U ? never : T 인가? (0) | 2023.01.27 |