본문 바로가기

FE/type-challenge

25170. ReplaceFirst

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>]
  : []

풀이

조건

  1. T의 요소 중 처음 나오는 SR로 교체한 후 T를 반환한다.
  1. TS가 없는 경우, 교체 없이 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