본문 바로가기

FE/type-challenge

18220. Filter

728x90

문제

Implement the type Filter<T, Predicate> takes an Array T, primitive type or union primitive type Predicate and returns an Array include the elements of Predicate.

cases

type Falsy = false | 0 | '' | null | undefined

type cases = [
  Expect<Equal<Filter<[0, 1, 2], 2>, [2]>>,
  Expect<Equal<Filter<[0, 1, 2], 0 | 1>, [0, 1]>>,
  Expect<Equal<Filter<[0, 1, 2], Falsy>, [0]>>,
]

문제 링크

정답

type Filter<T extends any[], P> = T extends [infer T1, ...infer Rest]
  ? T[0] extends P ? [T1, ...Filter<Rest, P>]
    : Filter<Rest, P>
  : []

풀이

조건

  1. P에 포함된 요소만 필터링해서 배열 형태로 출력한다.

해설

T의 요소에 순차적으로 접근하기 위해 다음과 같이 재귀적으로 검사한다.

type Filter<T extends any[], P> = T extends [infer T1, ...infer Rest]
  ? Filter<Rest, P>
  : []

T1P에 포함되는지 확인한다.

type Filter<T extends any[], P> = T extends [infer T1, ...infer Rest]
  ? T[0] extends P ? [T1, ...Filter<Rest, P>]
    : Filter<Rest, P>
  : []

 

728x90

'FE > type-challenge' 카테고리의 다른 글

21220. PermutationsOfTuple  (1) 2023.10.11
21106. Combs  (0) 2023.10.10
18142. All  (0) 2023.09.25
16259. ToPrimitive  (0) 2023.09.22
9898. FindEles  (0) 2023.09.19