🫧 문제
정확한 문자열 타입이고 양쪽 끝의 공백이 제거된 새 문자열을 반환하는 Trim<T>를 구현하십시오.
type trimmed = Trim<' Hello World '> // 기대되는 결과는 'Hello World'입니다.
☀️ 테스트 케이스
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 '>, ''>>,
]
🎱 정답
type Space = "\n" | '\t' | ' '
type Trim<S extends string> = S extends `${Space}${infer T}` | `${infer T}${Space}`? Trim<T> : S
💭 해설
type Space = "\n" | '\t' | ' '
Space라는 유니온 타입을 먼저 정의해준다. 해당 타입은 공백 문자들인 \n (개행), \t (탭), ' '(스페이스)을 포함해주면 됩니다.
type Trim<S extends string>
문제에 기본적으로 적혀져 있던 부분으로 Trim이라는 타입은 string 타입의 제네릭을 받습니다.
S extends `${Space}${infer T}` | `${infer T}${Space}`? Trim<T> : S
1. 만약 S가 ${Space}${infer T} 또는 ${infer T}${Space} 패턴과 일치하면, T부분을 추출해 Trim<T>로 재귀 호출을 합니다.
2. 위의 조건이 일치하지 않는 경우 S자체를 반환합니다.
이렇게 재귀호출을 통해 문자열의 앞뒤에 있는 공백이 있는 경우 계속 제거되며, 제거가 끝난 후에는 최종적으로 정리된 문자열이 반환됩니다.
'TypeScript' 카테고리의 다른 글
[Type-Challenges] 296. Permutation (0) | 2023.06.20 |
---|---|
[Type-Challenges] 119. ReplaceAll (0) | 2023.06.13 |
[Type-Challenges] 116. Replace (0) | 2023.06.13 |
[Type-Challenges] 110.Capitalize (0) | 2023.06.13 |
[TypeScript] Error(feat. catch) 타입 설정하기 (0) | 2023.05.01 |