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