본문 바로가기
IT/typescript

[typescript] infer

by 내일은교양왕 2024. 8. 14.

개념

조건부 타입에서 사용하는 기능으로, 컴파일러가 특정 타입을 추론하도록 도와주는 역할

infer를 이용해 타입 시스템 내에서 타입을 유추하고, 그 유추된 타입을 다른 타입 계산에 활용

 

기본 사용법

T extends U ? X : Y

 

`T`가 `U`를 상속하거나 extends 하면 타입 `X`를 사용하고, 그렇지 않으면 타입 `Y`를 사용. 

이 패턴에서 `infer`를 사용하면 `T`의 일부 타입을 유추하고 이를 타입 시스템 내에서 사용 할 수 있다.

 

예제

type MD<T> = T extends (...args: any[]) => infer R ? R : any;

type D = MD<() => number> //type: number
type E = MD<string> //type: any

 

`MD`는 함수 타입 `T`의 반환 타입(return type)을 추론하는 타입. 만약 `T`가 함수가 아니라면 `infer R`을 사용하여 그 함수의 반환 타입을 `R`로 추론

 

응용: 튜플의 첫 번째 요소 추출

type First<T extends any[]> = T extends [infer U, ...any[]] ? U : never;

type A = First<[string, number, boolean]>; // string
type B = First<[number]>; // number
type C = First<[]>; // never

 

`T extends any[]`를 선언하여 항상 배열만 받겠다는 의미. `T`로 선언했더라면 다른 타입도 받을 수 있음.

 

T가 배열일 경우, 첫번째 요소에 `Infer U`를 걸어 `U`를 반환

배열이 아니거나, `infer U`를 반환 할 수 없다면 never로.