이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.
문자열에서 지정한 문자를 제거하는 타입이다.
생각보다 쉬웠다.
type DropChar<S, C, T extends string = ''> = S extends `${infer F}${infer O}` ?
F extends C ? DropChar<O, C, T> : DropChar<O, C, `${T}${F}`> : T
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
// @ts-expect-error
Expect<Equal<DropChar<'butter fly!', ''>, 'butterfly!'>>,
Expect<Equal<DropChar<'butter fly!', ' '>, 'butterfly!'>>,
Expect<Equal<DropChar<'butter fly!', '!'>, 'butter fly'>>,
Expect<Equal<DropChar<' butter fly! ', ' '>, 'butterfly!'>>,
Expect<Equal<DropChar<' b u t t e r f l y ! ', ' '>, 'butterfly!'>>,
Expect<Equal<DropChar<' b u t t e r f l y ! ', 'b'>, ' u t t e r f l y ! '>>,
Expect<Equal<DropChar<' b u t t e r f l y ! ', 't'>, ' b u e r f l y ! '>>,
]
type DropChar<S, C, T extends string = ''> : 문자열을 저장할 수 있도록 제네릭 T를 설정해준다.
S extends `${infer F}${infer O}` ? : S를 첫 번째 문자와 나머지 문자열로 나누고,
F extends C ? DropChar<O, C, T> : DropChar<O, C, `${T}${F}`> : F가 C와 같다면, DropChar를 재귀하는데, 이때, T를 그대로 넘긴다. 만약 F가 C와 다르다면, DropChar를 하는데, T와F를 문자열로 하여 동시에 넘긴다.
T : 만약 재귀에 끝에 도달했다면, T를 리턴한다.
이제 다른 분들의 답을 봐보자.
type DropChar<S, C extends string> = S extends `${infer L}${C}${infer R}` ?
DropChar<`${L}${R}`, C> : S;
와... 이렇게도 풀 수 있구나... 전에도 이런 식의 문제를 봤었던 것 같은데.. 타입챌린지를 하면서 타입스크립트 문법에 익숙해질 필요가 있다고 느낀다... 열심히하자!!
'Language > Typescript' 카테고리의 다른 글
타입챌린지 : 2595 PickByType (medium) (0) | 2023.05.08 |
---|---|
타입챌린지 : 2257-MinusOne (medium) (0) | 2023.05.04 |
타입챌린지 : 1978-Percentage Parser (medium) (0) | 2023.04.27 |
타입챌린지 : 1367-Remove Index Signature (medium) (0) | 2023.04.24 |
타입챌린지 : 1130-ReplaceKeys (medium) (0) | 2023.04.22 |