kakasoo

앞 글자가 대문자인 문자열 타입 정의하기 본문

프로그래밍/TypeScript

앞 글자가 대문자인 문자열 타입 정의하기

카카수(kakasoo) 2023. 2. 19. 00:08
반응형

https://github.com/type-challenges/type-challenges/blob/main/questions/00110-medium-capitalize/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

 

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'
반응형