`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