이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.
https://github.com/type-challenges/type-challenges/blob/main/questions/00108-medium-trim/README.md
해당 문제는 문자열 양옆의 공백을 제거하는 타입인 Trim을 구현하는 문제이다.
일단, 이 문제를 보고 먼저 든 생각은 '어? 지난번에 구현했던 TrimLeft를 쓰면 되는 간단한 문제 아닌가?' 라는 생각이 들었다.
그래서 TrimLeft과 TrimRight를 만들어주고 이를 이용하여 Trim을 구현해보았다.
TrimLeft에 대한 코드는 다음 포스팅을 참고하자.
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를 해봤다면, 생각보다 쉽게 풀 수 있다.
'Language > Typescript' 카테고리의 다른 글
타입챌린지 : 116-Replace (medium) (0) | 2023.03.30 |
---|---|
타입챌린지 : 110-Capitalize (medium) (0) | 2023.03.29 |
타입챌린지 : 106-Trim Left (medium) (0) | 2023.03.27 |
타입챌린지 : 62-Type Lookup (0) | 2023.03.24 |
타입챌린지 : 20-Promise.all (0) | 2023.03.24 |