프로그래밍/TypeScript
앞 글자가 대문자인 문자열 타입 정의하기
카카수(kakasoo)
2023. 2. 19. 00:08
반응형
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
Answer
type LetterMap = {
'a': 'A',
'b': 'B',
'c': 'C',
'd': 'D',
'e': 'E',
'f': 'F',
'g': 'G',
'h': 'H',
'i': 'I',
'j': 'J',
'k': 'K',
'l': 'L',
'm': 'M',
'n': 'N',
'o': 'O',
'p': 'P',
'q': 'Q',
'r': 'R',
's': 'S',
't': 'T',
'u': 'U',
'v': 'V',
'w': 'W',
'x': 'X',
'y': 'Y',
'z': 'Z',
};
type MyCapitalize<S extends string> = S extends `${infer R extends keyof LetterMap}${infer rest}` ?
rest extends null ? `${LetterMap[R]}` : `${LetterMap[R]}${rest}` : S;
만약 타입 파라미터로 받은 인자 문자열 S가 `${infer R extends keyof LetterMap}${infer rest}`라면.
즉, 맨 앞이 소문자라면,
rest가 없을 경우에는 그 소문자를 대문자로 변환 ( = LetterMap[R]이 대문자가 된다. ) 하고,
rest가 있을 경우에는, 마찬가지로 그 소문자를 대문자로 변환하되 뒤에 rest를 이어 붙인 문자열이 되게 한다.
그리고 최초 질문으로 돌아가 문자열 S가 `${infer R extends keyof LetterMap}${infer rest}`가 아니라면,
즉 맨 앞이 소문자가 아니라면 ( = 소문자가 아닌 대문자, 혹은 애초에 한글이나 다른 문자일 수도 있다면 ),
그냥 그대로 S를 반환한다.
다만, 대문자의 경우, 사실 Uppercase라는 타입을 이용해서도 구현할 수 있다.
type A = Uppercase<'a'>; // 'A'
반응형