You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

32 lines
657 B

import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<ToNumber<'0'>, 0>>,
Expect<Equal<ToNumber<'5'>, 5>>,
Expect<Equal<ToNumber<'12'>, 12>>,
Expect<Equal<ToNumber<'27'>, 27>>,
Expect<Equal<ToNumber<'18@7_$%'>, never>>,
]
type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
type IsNumber<
S extends string,
> =
S extends `${Digit}${infer Tail}`
? IsNumber<Tail>
: S extends ''
? true
: false
;
type ToNumber<
S extends string,
Acc extends 1[] = []
> =
IsNumber<S> extends true
? `${Acc['length']}` extends S
? Acc['length']
: ToNumber<S, [...Acc, 1]>
: never