infer

홍범선·2023년 11월 1일
0

타입스크립트

목록 보기
33/34

infer

타입을 추가로 한번 더 유추할 수 있는 기능
Infer Keyword는 Condtional Type에서만 사용가능한 키워드다.
즉 extends 키워드를 사용했을 때 extend 한 대상에서 타입을 한번 더 추론하는 역할

Flattening

type Flatten<Type> = Type extends Array<string> ? string : Type 
//Extends하고서 오른쪽에 무언가 들어오는 것은 결국 이 왼쪽에 있는 타입이 오른쪽에 있는 타입에 유형이다.

//하지만 string만 된다.

type stringArray = Flatten<string[]>; //string이 된다.
type numberArray = Flatten<number[]> ; //number[]이 된다.

지금 Flatten이라는 타입을 제너릭으로 받고 있다.
제너릭인데 조건부 타입을 사용해서 string으로 이루어진 배열이라면 string으로 그렇지 않다면 Type으로 받고 있다.

stringArray는 string[]을 받기 때문에 조건에 맞아 string이 되지만 numberArray는 그렇지 않아 number[]가 되고 있다.

type Flatten2<Type, ElementType> = Type extends Array<ElementType> ? ElementType : Type
type stringArray2 = Flatten2<string[], string>; //string이 된다.
type numberArray2 = Flatten2<number[], number> ; //number이 된다.

물론 추가적으로 제너릭안에 타입을 넣어줘서 할 수도 있다.

type Flatten3<Type> = Type extends Array<infer ElementType> 
? ElementType
: Type // ElementType을 추론하라는 의미
//타입을 제너릭으로 받게 되는데 타입이 만약 Array이라면 Array타입 안에 구성되어 있는 타입을 추론해서 추론된 타입을 반환
type stringArray3 = Flatten3<string[]>; //string이 된다.
type numberArray3 = Flatten3<number[]> ; //number
type TwoDArray = Flatten3<boolean[][]>; //boolean[]

타입을 제너릭으로 받게 되는데 타입이 만약 Array이라면 Array타입 안에 구성되어 있는 타입을 추론해서 추론된 타입을 반환한다.

리턴타입 추론

type InferReturnType<Type> = Type extends (...args: any[]) => infer ReturnType ? ReturnType : Type; //반환타입을 유추

type NumberArray2 = InferReturnType<number[]>; // numberArray2타입이 된다. Type이 함수 시그니처로 extend하고 있지 않기 때문에 그대로 반환

type STringFunc = InferReturnType<() => string>; //string타입
type numberFunc = InferReturnType<() => number>; //() => number타입 , number

타입은 함수를 받고 있다. 하지만 리턴타입을 추론하고 있다.

profile
알고리즘 정리 블로그입니다.

0개의 댓글