728x90
문제
Implement the type ReplaceFirst<T, S, R>
which will replace the first occurrence of S
in a tuple T
with R
. If no such S
exists in T
, the result should be T
.
cases
type cases = [
Expect<Equal<ReplaceFirst<[1, 2, 3], 3, 4>, [1, 2, 4]>>,
Expect<Equal<ReplaceFirst<['A', 'B', 'C'], 'C', 'D'>, ['A', 'B', 'D']>>,
Expect<Equal<ReplaceFirst<[true, true, true], true, false>, [false, true, true]>>,
Expect<Equal<ReplaceFirst<[string, boolean, number], boolean, string>, [string, string, number]>>,
Expect<Equal<ReplaceFirst<[1, 'two', 3], string, 2>, [1, 2, 3]>>,
Expect<Equal<ReplaceFirst<['six', 'eight', 'ten'], 'eleven', 'twelve'>, ['six', 'eight', 'ten']>>,
]
정답
type ReplaceFirst<T extends readonly unknown[], S, R> = T extends [infer T1, ...infer Rest]
? T1 extends S
? [R, ...Rest]
: [T1, ...ReplaceFirst<Rest, S, R>]
: []
풀이
조건
T
의 요소 중 처음 나오는S
를R
로 교체한 후T
를 반환한다.
T
에S
가 없는 경우, 교체 없이T
를 반환한다.
해설
앞에서부터 순차적으로 접근하여, S
가 있는지 확인한다.
type ReplaceFirst<T extends readonly unknown[], S, R> = T extends [infer T1, ...infer Rest]
? T1 extends S
? // replace
: [T1, ...ReplaceFirst<Rest, S, R>] // check next one
: []
S
가 아니면 남은 요소들을 재귀적으로 검사한다.
S
를 발견하면 다음과 같이 R
로 교체한다.
type ReplaceFirst<T extends readonly unknown[], S, R> = T extends [infer T1, ...infer Rest]
? T1 extends S
? [R, ...Rest]
: [T1, ...ReplaceFirst<Rest, S, R>]
: []
혹시 오류나 개선점이 있다면 댓글 부탁드립니다.
728x90
'FE > type-challenge' 카테고리의 다른 글
26401. JSONSchema2TS (1) | 2023.10.18 |
---|---|
25270. Transpose (0) | 2023.10.13 |
21220. PermutationsOfTuple (1) | 2023.10.11 |
21106. Combs (0) | 2023.10.10 |
18220. Filter (0) | 2023.10.06 |