타입스크립트에서도 비슷한 에러가 발생할 수 있습니다. 다만 재귀 타입을 선언할 때 에러가 발생하기보다는 재귀 타입을 사용할 때 에러가 발생합니다.
type InfiniteRecur<T> = { item: InfiniteRecur<T> };
type Unwrap<T> = T extends { item: infer U } ? Unwrap<U> : T;
type Result = Unwrap<InfiniteRecur<any>>;
// Type instantiation is excessively deep and possibly infinite.
Unwrap 타입은 item 속성의 타입을 가져오는 타입입니다. 단, 가져온 타입이 { item } 객체의 꼴이면 다시 그 객체의 item 속성 타입을 가져옵니다. Unwrap<{ item: { item: { item: 'hi' } } }>은 'hi'인 셈입니다. 그런데 InfiniteRecur 타입은 무한하게 중첩된 item 속성을 갖고 있습니다. { item: { item: { item: ... } } }인 셈이죠. InfiniteRecur 타입은 무한하므로 Unwrap 타입은 유한한 시간 안에 InfiniteRecur 타입을 처리할 수 없습니다. 타입스크립트는 이를 파악할 수 있으므로 Type instantiation is excessively deep and possibly infinite. 에러를 표시합니다.
재귀 타입을 사용하는 대표적인 예시로, 프로그래밍할 때 자주 접하는 JSON 타입을 만들어봅시다. JSON은 문자열, 숫자, 불 값, null 그 자체이거나 다른 JSON으로 구성된 배열 또는 객체입니다. JSON 배열이나 JSON 객체 내부에는 다른 JSON이 들어 있을 수 있으므로 재귀 타입으로 선언해야 합니다.