타입 챌린지 1978 - Percentage Parser

소파의 벨로그·2025년 4월 3일

타입챌린지

목록 보기
43/131

문제 링크

문제

PercentageParser을 구현하세요. /^(+|-)?(\d*)?(\%)?$/ 정규식에 따라 T를 일치시키고 3개의 일치 요소를 얻습니다 구조는 [더하기 혹은 빼기, 숫자,단위]와 같아야 합니다. 일치 요소가 없다면, 기본값은 빈 문자열입니다.

내 풀이

type GetFirstNumber<T extends String,Result extends string=''>=
  T extends `${infer Num extends number}${infer LeftStr}`?
    GetFirstNumber<LeftStr,`${Result}${Num}`>
    :Result

type ExcludeFirstString<T extends string, Target extends string>=
  T extends `${Target}${infer Left}`?
    Left:
    T

type PercentageParserImplement<A extends string,Result extends string[] =[]>=
  Result['length'] extends 3?
    Result
    :Result['length'] extends 0?
      A extends `${infer Sign extends '+'|'-'}${infer LeftStr}`?PercentageParserImplement<LeftStr,[Sign]>:PercentageParserImplement<A,['']>
      :Result['length'] extends 1?
        PercentageParserImplement<ExcludeFirstString<A,GetFirstNumber<A>>,[Result[0],GetFirstNumber<A>]>
        :Result['length'] extends 2?
          [...Result,A extends '%' ?'%':'']
        :never
type PercentageParser<A extends string> =PercentageParserImplement<A>

무턱대고 분기별로 구현을 했다.

다른 사람의 풀이

type CheckPrefix<T> = T extends '+' | '-' ? T : never;
type CheckSuffix<T> =  T extends `${infer P}%` ? [P, '%'] : [T, ''];
type PercentageParser<A extends string> = A extends `${CheckPrefix<infer L>}${infer R}` ? [L, ...CheckSuffix<R>] : ['', ...CheckSuffix<A>];

spread 연산자를 활용한 깔끔한 풀이도 존재했다

참고자료

https://github.com/type-challenges/type-challenges/issues/3788

0개의 댓글