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
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
|