type ToInt<S> = S extends `0${infer X}` ? ToInt<X> : S extends `${infer N extends number}` ? N : 0;
type Q1 = string;
type Q10 = `${Q1}${Q1}${Q1}${Q1}${Q1}${Q1}${Q1}${Q1}${Q1}${Q1 & {}}`;
type Q100 = `${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}`;
type Q1000 = `${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}`;
type Q10k = `${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}`;
type Q100k = `${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}`;
type Len<S, Q extends string, R extends 1[] = []> = S extends `${Q}${infer T}`
? Len<T, Q, [...R, 1]>
: [R['length'], S];
type LengthOfString<S extends string> = Len<S, Q100k> extends [infer A extends number, infer S1]
? Len<S1, Q10k> extends [infer B extends number, infer S2]
? Len<S2, Q1000> extends [infer C extends number, infer S3]
? Len<S3, Q100> extends [infer D extends number, infer S4]
? Len<S4, Q10> extends [infer E extends number, infer S5]
? Len<S5, Q1> extends [infer F extends number, string]
? ToInt<`${A}${B}${C}${D}${E}${F}`>
: 0
: 0
: 0
: 0
: 0
: 0;
Solution by alexandroppolus #33269
type LengthOfString<S extends string> =
S extends `${infer First extends string}${string}`
? NumFrom<LengthAssessment<S, First>['Num']>
: 0
type LengthAssessment<S extends string, Tenfold extends string> =
S extends `${Tenfold}${infer _ extends string}`
? LengthAssessment<S, Repeat<Tenfold, '10'>> extends infer A extends {Num: string, Rest: string}
? A['Rest'] extends `${Repeat<Tenfold, '9'>}${infer Rest extends string}`
? {Num: `${A['Num']}9`, Rest: Rest}
: A['Rest'] extends `${Repeat<Tenfold, '8'>}${infer Rest extends string}`
? {Num: `${A['Num']}8`, Rest: Rest}
: A['Rest'] extends `${Repeat<Tenfold, '7'>}${infer Rest extends string}`
? {Num: `${A['Num']}7`, Rest: Rest}
: A['Rest'] extends `${Repeat<Tenfold, '6'>}${infer Rest extends string}`
? {Num: `${A['Num']}6`, Rest: Rest}
: A['Rest'] extends `${Repeat<Tenfold, '5'>}${infer Rest extends string}`
? {Num: `${A['Num']}5`, Rest: Rest}
: A['Rest'] extends `${Repeat<Tenfold, '4'>}${infer Rest extends string}`
? {Num: `${A['Num']}4`, Rest: Rest}
: A['Rest'] extends `${Repeat<Tenfold, '3'>}${infer Rest extends string}`
? {Num: `${A['Num']}3`, Rest: Rest}
: A['Rest'] extends `${Repeat<Tenfold, '2'>}${infer Rest extends string}`
? {Num: `${A['Num']}2`, Rest: Rest}
: A['Rest'] extends `${Tenfold}${infer Rest extends string}`
? {Num: `${A['Num']}1`, Rest: Rest}
: {Num: `${A['Num']}0`, Rest: A['Rest']}
: never // infer A
: {Num: '', Rest: S}
type Repeat<Ch extends string, N extends string> =
N extends `${infer P extends string}${keyof Factory}`
? Factory<Ch, Repeat<Ch, P>>[N extends `${P}${infer L extends keyof Factory}` ? L : never]
: ''
type Factory<Ch extends string = '', T extends string = ''> = {
0: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}`
1: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}`
2: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}`
3: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}`
4: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}`
5: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}`
6: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}`
7: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}`
8: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}`
9: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}`
}
type NumFrom<S extends string> =
S extends `${infer N extends number}`
? number extends N ? never : N
: never
Solution by teamchong #33139