24
loading...
This website collects cookies to deliver better user experience
type Units = 'px' | 'rem' | '%';
type Units = 'px' | 'rem' | '%';
type IsValidCSS<T extends string> = T extends `${number}${Units}` ? true : false;
type Result = IsValidCSS<'10px'> // true
type Result2 = IsValidCSS<'10p'> // false
type Units = 'px' | 'rem' | '%';
type IsValidCSS<T extends string> = T extends `${number}${Units}` ? true : false;
type Validator<T extends boolean> = T extends true ? [] : [never];
type Test = Validator<IsValidCSS<'10px'>> // []
const foo = <T,>(arg: T, ...validation: Validator<IsValidCSS<T>>) => {}
foo('10px'); // error
10px
.const foo = <T extends string>(arg: T, ...validation: Validator<IsValidCSS<T>>) => {}
foo('10px'); // ok
foo('10%'); // ok
foo('10p'); // error
99
in our CSStype Units = 'px' | 'rem' | '%';
type IsValidCSS<T> = T extends `${number}${Units}` ? true : false;
type StringNumber<T extends number> = `${T}`;
type IsAllowedNumber<T> =
T extends `${infer Num}${Units}`
? Num extends StringNumber<99>
? false
: true
: false;
type Validator<T extends boolean> =
T extends true
? []
: ['Dear developer, please use valid CSS values'];
const foo = <T extends string>
(
arg: T,
...validation: [...Validator<IsValidCSS<T>>, ...Validator<IsAllowedNumber<T>>]
) => { }
foo('100px'); // ok
foo('99px'); // expected error
Validator
fails, it returns [never]
and because we are using rest operator it evaluates to never
.Validator
has failed, TS expects second argument which is never
.