타입을 추가로 한번 더 유추할 수 있는 기능
Infer Keyword는 Condtional Type에서만 사용가능한 키워드다.
즉 extends 키워드를 사용했을 때 extend 한 대상에서 타입을 한번 더 추론하는 역할
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
타입은 함수를 받고 있다. 하지만 리턴타입을 추론하고 있다.