[TypeScript] Conditional Types, extends, infer

2022. 12. 25. 22:20·프로그래밍 언어/TypeScript

Conditional Types

TypeScript에서 삼항 연산자를 이용해 타입을 지정하는 방식입니다.

 

예시) TypeScript에 내장된 Utility Types의 Extract 타입

type Extract<T, U> = T extends U ? T : never

T extends U 가 참이면 T를, 그렇지 않으면 never를 반환합니다.

 

삼항 연산자의 조건문에 올 수 있는 문법에는 extends 키워드 밖에 없습니다.

extends

extends 키워드는 슈퍼 클래스를 서브 클래스에게 상속해 줄 때 사용하는 키워드입니다.

타입 지정 시, extends 키워드는 T extends U 에 대해 T 는 U 에 포함된다는 의미입니다.

 

extends 키워드가 사용되는 조건문 예시를 살펴보며 제대로 이해한 게 맞는지 확인해보겠습니다.

다음 조건문들은 true 로 평가될까요? 아니면 false 로 평가될까요? 

1. 10000 extends number : 10000은 number에 포함되므로 true입니다.

2. number extends 10000 : number는 TypeScript에 존재하는 모든 숫자를 나타내는 타입이고, 숫자 10000은 1000일 뿐입니다. number 가 10000보다 더 큰 개념이므로 false입니다.

3. string[ ] extends any : any는 TypeScript에 존재할 수 있는 모든 타입의 교집합이므로 전체 집합이라고 생각해도 무방합니다. 그러므로 string[]은 any에 포함되므로 true입니다.

4. never extends any : never를 공집합으로 생각한다면 never는 any에 포함되므로 true입니다.

infer

infer 키워드는 삼항 연산자의 조건문에 쓰이는 타입 중 하나를 이름 붙여서 빼 와서 삼항 연산자의 true 절이나 false 절에 사용합니다.

infer 키워드가 사용되는 예시) 함수 타입을 인자로 받아서 해당 함수의 반환값의 타입을 Promise로 감싸 반환하는 PromiseReturnType

type AnyFunction = (...args: any) => any;
type PromiseReturnType<F extends AnyFunction> = F extends (...args: any) => infer R ? Promise<R> : never

PromiseReturnType은 하나의 타입을 인자 F로 받아서, 어떠한 조건문을 거쳐 Promise<R>이나 never를 반환합니다.

타입을 인자로 받는 부분을 먼저 살펴보겠습니다.

F extends (...args: any) => any

인자로 받을 타입 F는 F extends (...args: any) => any 조건을 만족해야 합니다. 즉 F는 반드시 함수여야 합니다.

 

우변항을 살펴보겠습니다.

F extends (...args: any) => infer R ? Promise<R> : never

F extends (...args: any) => infer R 이 참이면 Promise<R>을, 그렇지 않으면 never를 반환합니다.

 

'프로그래밍 언어 > TypeScript' 카테고리의 다른 글

[TypeScript] 기본 타입  (0) 2022.12.20
TypeScript 언어 소개 및 장점 및 단점, 컴파일러 동작 방식  (0) 2022.11.14
[Typescript] Builder Pattern  (0) 2022.08.07
'프로그래밍 언어/TypeScript' 카테고리의 다른 글
  • [TypeScript] 기본 타입
  • TypeScript 언어 소개 및 장점 및 단점, 컴파일러 동작 방식
  • [Typescript] Builder Pattern
rondeveloper
rondeveloper
  • rondeveloper
    Ron's learning record
    rondeveloper
  • 전체
    오늘
    어제
    • 분류 전체보기 (99) N
      • k8s (1) N
      • AWS (1)
      • 리눅스 (3)
      • Docker (8)
      • 라이브러리 & 프레임워크 (14)
        • React (2)
        • NestJS (8)
        • Spring (0)
        • Django (3)
        • FastAPI (1)
      • 웹 (2)
        • Nginx (1)
      • 프로그래밍 언어 (29)
        • HTML (0)
        • CSS (0)
        • JavaScript (21)
        • Python (3)
        • Node.js (0)
        • TypeScript (4)
        • Java (1)
      • Today I learned (9)
      • 알고리즘 (9)
        • 백준 (0)
        • 프로그래머스 (8)
        • 개념 (1)
      • 티끌모아 태산 (5)
        • 하루에 영단어 하나씩 (5)
        • 독서 (0)
      • 시행착오 (3)
      • 데이터베이스 (2)
        • MySQL (0)
      • 컴퓨터 과학 (8)
        • 네트워크 (2)
        • 운영체제 (0)
        • 데이터베이스 (2)
        • 자료구조 (4)
      • 포트폴리오 (4)
        • JJINCAFE IN SEOUL (4)
        • CODEUNICORN (0)
      • 회고 (0)
      • CICD (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Til
    조인
    리눅스
    mysql
    Python
    자바스크립트
    redis
    Kubernetes
    typeorm
    javascript
    배열
    레벨2
    도커
    Docker
    스택
    typescript
    컨테이너
    코딩테스트
    Kubectl
    프로그래머스
    쿠버네티스
    nestjs
    django
    iterable
    FastAPI
    모듈
    생활코딩
    기초
    IP 주소
    네트워크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
rondeveloper
[TypeScript] Conditional Types, extends, infer
상단으로

티스토리툴바