TypeScript/한 입 크기로 잘라먹는 타입스크립트
[조건부 타입] infer
해갈
2023. 7. 24. 10:18
해당 게시글은
강의 사이트, 인프런에서 이정환님이 진행하시는
'한 입 크기로 잘라먹는 타입스크립트' 를
들어보며 블로그를 작성하려고 합니다.
다음 게시글 내용은 해당 강의에 핸드북의 내용으로
출처는 다음과 같습니다.
https://ts.winterlood.com/7250edd7-a3fd-4662-b756-f11f927c73f2
타입스크립트를 소개합니다 - 타입스크립트 개론
한 입 크기로 잘라먹는 타입스크립트
ts.winterlood.com
section0/chapter2.ts 에서 실습을 진행했습니다.
infer
infer 는 조건부 타입 내에서 특정 타입을 추론하는 문법입니다.
infer 는 다음과 같이 특정 함수 타입에서 반환값의 타입만 추출하는
특수한 조건부 타입인 "Return Type" 을 만들 때 이용할 수 있습니다.
type ReturnType<T> = T extends () => infer R ? R : never;
type FuncA = () => string;
type FuncB = () => number;
type A = ReturnType<FuncA>;
// string
type B = ReturnType<FuncB>;
// number
① 조건식 T extends () => infer R 에서 infer R 은 이 조건식을 참이 되도록 만들 수 있는 최적의 R 타입을 추론하라는 의미입니다.
② 타입 변수 T 에 함수 타입 FuncA 가 할당되고, T 는 () => string 이 됩니다. 조건부 타입의 조건식은 다음 형태가 됩니다. () => string extends () => infer R ? R : never
조건식을 참으로 만드는 R 타입을 추론합니다. 그 결과 R 은 string 이 됩니다. 추론이 가능하면 이 조건식을 참으로 판단합니다. 따라서 결과는 string 이 됩니다.
만약 다음과 같이 추론이 불가능하다면
조건식을 거짓으로 판단합니다.
type ReturnType<T> = T extends () => infer R ? R : never;
type FuncA = () => string;
type FuncB = () => number;
type A = ReturnType<FuncA>;
// string
type B = ReturnType<FuncB>;
// number
type C = ReturnType<number>;
// 조건식을 만족하는 R추론 불가능
// never
다음은 Promise 의 resolve 타입을 infer 를 이용해 추출하는 예입니다.
type PromiseUnpack<T> = T extends Promise<infer R> ? R : never;
// 1. T는 프로미스 타입이어야 한다.
// 2. 프로미스 타입의 결과값 타입을 반환해야 한다.
type PromiseA = PromiseUnpack<Promise<number>>;
// number
type PromiseB = PromiseUnpack<Promise<string>>;
// string