반응형
튜플의 타입 추론 개선
TypeScript는 튜플을 선언할 때 튜플의 타입에 관대한 편입니다.
튜플의 길이, 그리고 어떤 위치에 어떤 타입이 들어있는지는 무시하고 주어진 상황에서 제공할 수 있는 가장 일반적인 타입으로 튜플의 타입을 추론합니다.
let a = [4, false] // let a: (number | boolean)[]
하지만 때로는 조금 더 엄격한 추론이 필요한데, 예를 들어 앞 예에서 a를 배열이 아니라 고정된 길이의 튜플로 취급하고 싶을 수 있습니다.
물론 타입 어서션을 이용해 튜플을 튜플 타입으로 형변환할 수 있습니다.
또는 as const 어서션을 이용해 튜플의 타입을 가능한 한 좁게 추론하는 동시에 읽기 전용으로 만들 수 있습니다.
타입 어서션을 사용하지 않고 추론 범위도 좁히지도 않고, 그리고 읽기 전용 한정자를 추가하는 as const도 사용하지 않으면서 튜플을 튜플 타입으로 만들려면 어떻게 해야 할까요?
TypeScript가 나머지 매개변수의 타입을 추론하는 기법을 이용하면 됩니다.
function tuple< // ①
T extends unknown[] // ②
>(
...ts: T // ③
): T { // ④
return ts // ⑤
}
let a = tuple(4, false) // let a: [number, boolean]
- 튜플 타입을 만드는 데 사용할 tuple 함수를 선언합니다. (내장 문법 [] 대신 사용합니다.)
- unknown[]의 서브 타입인 단일 타입 매개변수 T를 선언합니다. (T는 모든 종류의 타입을 담을 수 있는 배열임을 의미합니다.)
- tuple은 임의 개수의 매개변수 ts를 받습니다. T는 나머지 매개변수를 나타내므로 TypeScript는 이를 튜플 타입으로 추론합니다.
- tuple 함수는 ts의 추론 타입과 같은 튜플 타입의 값을 반환합니다.
- 함수는 우리가 전달한 인수를 그대로 반환합니다. 모든 마법은 타입과 관련해서 이루어집니다.
튜플 타입이 많이 등장하는 코드라면 이 기법을 활용해 타입 어서션 사용을 줄일 수 있습니다.
반응형
'👶 TypeScript' 카테고리의 다른 글
조건부 타입 (0) | 2023.01.21 |
---|---|
고급 함수 타입들 - 사용자 정의 타입 안전 장치 (0) | 2023.01.20 |
컴패니언 객체 패턴(companion object pattern) (0) | 2023.01.20 |
매핑된 타입(mapped type) (0) | 2023.01.20 |
Record 타입 (0) | 2023.01.20 |