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>
: []
풀이
조건
P
에 포함된 요소만 필터링해서 배열 형태로 출력한다.
해설
T
의 요소에 순차적으로 접근하기 위해 다음과 같이 재귀적으로 검사한다.
type Filter<T extends any[], P> = T extends [infer T1, ...infer Rest]
? Filter<Rest, P>
: []
T1
이 P
에 포함되는지 확인한다.
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 |