type-challenges
type-challenges copied to clipboard
1978 - Percentage Parser
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>];
nice job
Thanks for the nice code
You are incredibly smart! Fantastic.
Little more readable
type PercentageParser<A extends string> = A extends `${infer Num}%`
? [...NumberParser<Num>, '%']
: [...NumberParser<A>, ''];
type NumberParser<A extends string> = A extends `${infer Sign extends '+' | '-'}${infer Num}`
? [Sign, Num]
: ['', A];
type PercentageParser<A extends string,F1 extends string='',F2 extends string='',F3 extends string=''> = A extends `${infer A1}${infer R}`?A1 extends "-"|"+"?PercentageParser<R,A1>:A1 extends `${infer BBB extends number}`?PercentageParser<R,F1,`${F2}${A1}`>:PercentageParser<R,F1,F2,"%">:[F1,F2,F3]
type PercentageParser<
T extends string,
R extends string[] = []
> = R["length"] extends 0
// check operator
? T extends `${infer O extends "+" | "-"}${infer Rest extends string}`
? PercentageParser<Rest, [...R, O]>
: PercentageParser<T, [...R, ""]>
// check empty
: T extends "" ? [...R, "", ""]
// check number and %
: T extends `${infer N extends string}%${string}`
? [...R, N, "%"]
: [...R, T, ""];
type PercentageParser<A extends string> =
(A extends `${infer S extends '+' | '-'}${string}` ? S : '') extends infer S extends string ?
(A extends `${string}${infer P extends '%'}` ? P : '') extends infer P extends string ?
A extends `${S}${infer N}${P}` ?
[S, N, P] : never : never : never;
How about that?
type PercentageParser<T extends string, A extends any[] = ['', '', '']> =
T extends `${infer First}${infer Tail}`
? PercentageParser<
Tail,
First extends '+' | '-' ? [First, A[1], A[2]] : First extends '%'
? [A[0], A[1], First]
: [A[0], `${A[1]}${First}`, A[2]]>
: A;