Lsiron

Type Script 에서 조건문으로 타입만들기, infer 본문

언어/Type Script

Type Script 에서 조건문으로 타입만들기, infer

Lsiron 2024. 7. 18. 17:33

TypeScript에서 조건부 타입(Conditional Types)은 특정 조건에 따라 타입을 다르게 결정하는 기능을 제공한다.

 

이와 함께 infer 키워드를 사용하면 타입 추론을 통해 조건부 타입을 더욱 강력하게 사용할 수 있다.

 

각각에 대해 한번 자세히 알아보자.

 

조건부 타입

조건부 타입은 기본적으로 T extends U ? X : Y 형태(삼항연산자)로 작성되며,

 

이는 "만약 T가 U에 할당 가능하다면 X 타입을 사용하고, 그렇지 않으면 Y 타입을 사용한다"는 의미이다.

 

예시를 통해 알아보자.

 

type Lsiron<T> = T extends string ? string : unknown

let siron:Lsiron<string> // 타입이 string이 된다.
let iron:Lsiron<number> // 타입이 unknown이 된다.

 

Age의 타입이 string이라면 string을 남겨주고, string 타입이 아니면 모두 unknown 타입을 반환해달라는 뜻 이다.

 

infer 키워드

infer 키워드는 조건부 타입 내에서 타입 변수를 선언하고, 해당 타입을 다른 부분에서 참조할 수 있게 한다.

 

이는 주로 타입 추론에서 유용하게 사용된다.

 

쉽게 말해서 infer 키워드는 왼쪽에 있는 값으로부터 타입을 추출해주는 역할을 한다.

type Lsiron<T> = T extends infer R ? string : unknown

 

그렇다면 위 예시의 경우는 T 에서 타입을 추출해서 R 변수에 담아달라는 의미가 된다.

 

기본 예시

type Lsiron<T> = T extends infer R ? string : unknown

Lsiron<string>

 

이렇게 타입으로 string을 넣어주면 T와 R은 string이 된다.

 

infer 키워드를 사용하여 뽑아주는 이유는 R 변수에 타입을 담기 위해서이다. 이로써 다른 코드에서 string 타입을 사용 할 때 R을 사용할 수 있다.

 

배열 예시 

array 내부의 타입을 추출 해야하는 경우가 있다.

type Lsiron<T> = T extends (infer R)[] ? R : unknown

let siron:Lsiron<string[]>

 

위와 같이 string[]로 배열의 타입을 넣어줘도 R 자리에는 string 타입이 남고 ( [] 은 이미 지정되어있고 R만 가져왔기 때문 ) R( string ) 을 반환하게 된다.

 

이렇게 siron 변수의 타입은 string 타입이 된다.

 

함수 예시

함수의 return 타입을 추출 해야하는 경우가 있다.

type Lsiron<T> = T extends ( () => infer R) ? R : unknown

let siron:Lsiron< () => void >

 

위와 같이 () => void 로 함수의 타입을 넣어줘도 R 자리에는 void 타입이 남고 ( () => 애로우 함수 형태는 이미 지정되어 있고 R만 가져왔기 때문 ) R( void ) 을 반환하게 된다. 

 

이렇게 siron 변수의 타입은 void 타입이 된다.

 

사실 함수를 넣었을때 함수의 return 타입만 추출하고 싶은 경우엔 ReturnType 이라는 기본 함수를 쓰면 자동으로 추출이 된다.

 

굳이 위 처럼 조건문을 사용하여 추출할 필요가 없다.

type lsiron = ReturnType< () => void >

 

이러면 siron 타입은 void 타입이 된다.

 

참조 : 코딩애플