본문 바로가기
Language/Typescript

타입챌린지 : 108-Trim (medium)

by hsloth 2023. 3. 28.

 

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.

 

https://github.com/type-challenges/type-challenges/blob/main/questions/00108-medium-trim/README.md

 

GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

Collection of TypeScript type challenges with online judge - GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

github.com

 

해당 문제는 문자열 양옆의 공백을 제거하는 타입인 Trim을 구현하는 문제이다.

 

일단, 이 문제를 보고 먼저 든 생각은 '어? 지난번에 구현했던 TrimLeft를 쓰면 되는 간단한 문제 아닌가?' 라는 생각이 들었다.

그래서 TrimLeft과 TrimRight를 만들어주고 이를 이용하여 Trim을 구현해보았다.

 

TrimLeft에 대한 코드는 다음 포스팅을 참고하자.

https://suloth.tistory.com/59

 

타입챌린지 : 106-Trim Left (medium)

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다. https://github.com/type-challenges/type-challenges/blob/main/questions/00106-medium-trimleft/RE

suloth.tistory.com

 

type TrimLeft<S extends string> = S extends `${" " | "\n" | "\t" }${infer O}` ? TrimLeft<O> : S;

type TrimRight<S extends string> = S extends `${infer O}${" " | "\n" | "\t"}` ? TrimRight<O> : S;

type Trim<S extends string> = TrimRight<TrimLeft<S>>;


/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Trim<'str'>, 'str'>>,
  Expect<Equal<Trim<' str'>, 'str'>>,
  Expect<Equal<Trim<'     str'>, 'str'>>,
  Expect<Equal<Trim<'str   '>, 'str'>>,
  Expect<Equal<Trim<'     str     '>, 'str'>>,
  Expect<Equal<Trim<'   \n\t foo bar \t'>, 'foo bar'>>,
  Expect<Equal<Trim<''>, ''>>,
  Expect<Equal<Trim<' \n\t '>, ''>>,
]

간단하다. TrimLeft를 토대로 TrimRight를 만들어서

Trim 타입을 TrimLeft, TrimRight를 순차적으로 하게 만들어준 코드이다. 

 

이를 풀어서 간단하게 타입을 만들어보면 다음과 같이 만들 수 있다.

type Trim<S extends string> = S extends `${" " | "\n" | "\t"}${infer O}` | `${infer O}${" " | "\n" | "\t"}` ? Trim<O> : S;

S가 왼쪽 혹은 오른쪽에 공백이 있으면 Trim을 하고 아니라면 문장을 그대로 리턴한다.

 

 

끝! TrimLeft를 해봤다면, 생각보다 쉽게 풀 수 있다.