`infer` 의 경우 [[Conditional Type]]에서 제한적으로 사용할 수 있는 키워드이다. 예제를 확인하는 것이 가장 빠르게 이해할 수 있다.
```typescript
type GetDataValue<T> = T extends { data: infer TInferredData }
? TInferredData
: never
type tests = [
Expect<Equal<GetDataValue<{ data: "hello" }>, "hello">>,
Expect<Equal<GetDataValue<{ data: { name: "hello" } }>, { name: "hello" }>>
]
```
`GetDataValue` 는 타입 변수가 선언되어있고 (`T`) [[Conditional Type]] 으로, `T`가 `{data: infer TInferredData}` 의 형식이라면 `TInferredData`로 타입이 입력되고 아니라면 never로 입력된다.
**이 곳에서 `infer`의 역할은 `TInferredData`라는 변수를 선언하고 `data`의 타입이 그 변수에 할당된다. 그래서 `TInferredData` 는 조건문 내부에서 사용되는 형식이다.**
예제를 한가지 더 확인해보면,
```typescript
interface MyComplexInterface<Event, Context, Name, Point> {
getEvent: () => Event;
getContext: () => Context;
getName: () => Name;
getPoint: () => Point;
}
type Example = MyComplexInterface<
"click",
"window",
"my-event",
{ x: 12; y: 14 }
>;
type GetPoint<T> = T extends MyComplexInterface<any, any, any, infer TPoint>
? TPoint
: never;
type tests = [Expect<Equal<GetPoint<Example>, { x: 12; y: 14 }>>];
```
위의 예제에서 `GetPoint` 타입을 만들기 위해 마찬가지로 [[Conditional Type]]을 사용하고 있다. `T`가 `MyComplexInterface` 인터페이스의 형식이라면 `TPoint`가 타입이 되고 아니라면 `never`가 된다. 이 때 `MyComplexInterface`의 네번째 타입 인자를 추론하기 위해 `infer` 키워드를 사용했다. `TPoint` 타입 변수를 선언하고 그 변수가 `GetPoint`의 타입을 결정하기 위해 사용되었다.
---
참조 강의: https://inf.run/FVDi