반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바스크립트
- 프로그래머스 레벨 2
- 그래프
- javascript
- TCP
- 알고리즘
- 문자열
- socket
- HTTP 완벽 가이드
- 레벨 1
- 가천대
- 수학
- 크롤링
- 타입스크립트
- typescript
- HTTP
- dp
- ip
- 쉬운 문제
- type challenge
- Node.js
- 백준
- BFS
- dfs
- 소켓
- Algorithm
- Crawling
- 프로그래머스
- Nestjs
- 타입 챌린지
Archives
- Today
- Total
kakasoo
Chainable, 연쇄적인 호출이 가능한 타입 본문
반응형
type Chainable<T = {}> = {
option<K extends string, P>(key: K, value: P): Chainable<Omit<T, K> & Record<K, P>>;
get(): T;
}
const result1 = a
.option('foo', 123)
.option('bar', { value: 'Hello World' })
.option('name', 'type-challenges')
.get()
const result2 = a
.option('name', 'another name'
// @ts-expect-error
.option('name', 'last name')
.get()
const result3 = a
.option('name', 'another name')
// @ts-expect-error
.option('name', 123)
.get()
type Expected1 = {
foo: number
bar: {
value: string
}
name: string
}
type Expected2 = {
name: string
}
type Expected3 = {
name: number
}
option이라는 메서드를 계속적으로 호출해가며 원하는 객체 모양을 만들 수 있는 type Chainable을 구현했다.
Chainable은 시작 타입 파라미터로 빈 객체인 T를 가지고 있으며,
option 메서드는 계속 해서 호출되어야 하기에 무조건 Chainable 타입을 반환해야만 했다.
옵션의 두 파라미터 key, value는 string과 아직 확정되지 않은 any 타입을 가진 K, P로 정의되었다.
이 함수의 결과 값은 Chainable이기에, 1차적으로 Chainable<T, & Record<K, P>>가 되어야 했다.
하지만 문제에 주어진 조건과 같이 동일한 key로 선언할 경우 후에 선언한 게 더 우선시되어야만 한다.
따라서 Chainable<Omit<T, K> & Record<K, P>>가 가장 적합하다.
이전에 할당을 했든 안했든 일단 K를 T로부터 지우고, 다시 K에 새로운 타입을 정의하는 것이다.
반응형
'프로그래밍 > TypeScript' 카테고리의 다른 글
Equal type 설명하기 (1) | 2023.03.05 |
---|---|
MyAwaited, 프로미스 내부의 타입을 추론해서 꺼내기 (0) | 2023.02.25 |
앞 글자가 대문자인 문자열 타입 정의하기 (0) | 2023.02.19 |
TupleToUnion 타입 정의하기 (0) | 2023.02.17 |
Readonly type 구현 (0) | 2023.02.15 |