본문 바로가기
Language/Typescript

타입챌린지 : 3192-Reverse (medium)

by hsloth 2023. 5. 25.

 

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.

 

https://github.com/type-challenges/type-challenges/blob/main/questions/03192-medium-reverse/README.md

 

GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

Collection of TypeScript type challenges with online judge - GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

github.com

 

제네릭으로 들어오는 배열을 뒤집어서 리턴하는 타입이다.

간단하다.

type Push<T, U> = T extends any[] ? [...T, U] : never;

type Reverse<T extends any[], U extends any[] = []> =  
	T extends [...infer O, infer L] ? Reverse<O, Push<U, L>> : U;
    
    

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Reverse<[]>, []>>,
  Expect<Equal<Reverse<['a', 'b']>, ['b', 'a']>>,
  Expect<Equal<Reverse<['a', 'b', 'c']>, ['c', 'b', 'a']>>,
]

type errors = [
  // @ts-expect-error
  Reverse<'string'>,
  // @ts-expect-error
  Reverse<{ key: 'value' }>,
]

T extends [...infer O, infer L] ? : T에서 마지막 원소 L을 빼내서,

Reverse<O, Push<U, L>> : U : 재귀로 U라는 배열에 마지막 원소를 차례대로 push한다. 그리고 마지막에는 U를 리턴한다.