Lsiron
Type Script 에서 조건문으로 타입만들기, infer 본문
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 타입이 된다.
참조 : 코딩애플
'언어 > Type Script' 카테고리의 다른 글
Type Script의 데코레이터란? (0) | 2024.07.20 |
---|---|
Type Script 의 Object 심화 (index signature, recursive, keyof, 타입변환기) (0) | 2024.07.18 |
Type Script 의 implements ? (0) | 2024.07.18 |
Type Script 에서 d.ts 파일이란? 그리고 외부 js 라이브러리 가져오기 (0) | 2024.07.18 |
Type Script 에서 외부 자바스크립트 파일을 사용할 때 (declare, ambient module / local module) (0) | 2024.07.17 |