Zoeken op website

string - TypeScript: Template Literal Type sluit spaties niet uit


Hoe declareer je een template literal type dat spaties ertussen verbiedt?

Dit is wat ik heb, maar het staat spaties toe tussen het nummer en de eenheid.

 type Duration =`${number}${'ms' | `s`}`
    
    let a: Duration = "2000 ms" // should not compile due to ' ' 
    let b: Duration = "2s" // ok
    let c: Duration = "2000ms" // ok

>> typescriptlang.org speelplaats

Antwoord #1

type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
type Unit = 'ms' | 's';
type ValidDuration = `${Digit}${number | ""}${Unit}` & `${number | ""}${Digit}${Unit}`;

let a: ValidDuration = "1 ms" // error as intended
let b: ValidDuration = "2s" // ok
let c: ValidDuration = "2000ms" // ok

const duration = (value: ValidDuration) => value


const x = duration("1ms"); // okay
const y = duration("20000ms"); // okay
const w = duration("1 ms"); // error as intended
const v = duration(" 1ms"); // error as intended

Zie TypeScript Playground. Dit is slechts een oplossing om de ongewenste spaties te verbieden. Het illustreert het basisidee, namelijk te controleren of de substring die als een nummer moet worden geïnterpreteerd begint en eindigt met een cijfer (en daarom zijn voorloop- en naloopspaties verboden). Meer toelichting is nodig indien onnodige voorloopnullen moeten worden uitgesloten (dat wil zeggen, "03ms" verbieden maar "0ms" toestaan) en als andere cijfers dan natuurlijke cijfers moeten worden toegestaan (bijvoorbeeld "5.2ms" of "-7s").

Gerelateerde artikelen