Copy function fibonacci (num) {
if (num <= 1 ) return 1
return fibonacci (num - 1 ) + fibonacci (num - 2 );
}
Copy type Recursive = {
name : string ;
children : Recursive [];
}
const recur1 : Recursive = {
name : 'test' ,
children : [] ,
}
const recur2 : Recursive = {
name : 'test' ,
children : [
{ name : 'test2' , children : [] } ,
{ name : 'test3' , children : [] } ,
]
}
Copy // 재귀적으로 배열의 요소 내부 접근해서 요소 타입을 겟
type ElementType < T > = T extends any [] ? ElementType < T [ number ]> : T ;
Copy type T = number | string | Record < string , T >; // error
type T = number | string | { [key : string ] : T };
재귀 타입도 맥시멈 콜스택과 비슷한 에러 발생 가능
Copy type InfiniteRecur < T > = { item : InfiniteRecur < T > };
type Unwrap < T > = T extends { item : infer U } ? Unwrap < U > : T ;
type Result = Unwrap < InfiniteRecur < any >>; // error
// Unwrap<{ item: { item: { item: 'hi' } } } > -> hi
// InfiniteRecur 타입은 무한하여 Unwrap 타입은 유한한 시간 안에 InfiniteRecur 타입을 처리할 수 없음##복잡한 구조도 쉽게 표현 가능
Copy type JSONType =
| string
| boolean
| number
| null
| JSONType []
| { [key : string ] : JSONType };
const a : JSONType = 'string' ;
const b : JSONType = [ 1 , false , { "hi" : "json" }];
const c : JSONType = {
prop : null ,
arr : [{}] ,
}
Copy type Reverse < T > = T extends [ ...infer L , infer R ] ? [ R , ... Reverse < L >] : []
Copy // 내가 첫 시도한 타입인데...
type ReverseParams < T > = T extends ( ... infer LP , infer RP) => any
? [ RP , ... ReverseParms < LP >] : []
// 정답
type FlipArguments < T > = T extends ( ... args : infer A ) => infer R
? ( ... args : Reverse < A >) => R
: never
// 반환값과 매개변수의 타입을 추론한 뒤, 매개변수의 Reverse 타입 적용,
// A는 이미 매개변수의 튜플 상태이므로 바로 Reverse 타입 적용 가능
type Flipped = FlipArguments <(a : string , b : number , c : boolean ) => string >;