string - TypeScript: Mallsträngtyp utesluter inte mellanslag


Hur deklarerar man en mallbokstavstyp som förbjuder mellanslag däremellan?

Detta är vad jag har, men det tillåter mellanslag mellan siffran och enheten.

 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 lekplats

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

Jfr. TypeScript Playground. Detta är bara en lösning för att förbjuda de oönskade mellanslagen. Den illustrerar den grundläggande idén, nämligen att kontrollera om delsträngen som ska tolkas som ett tal börjar och slutar med en siffra (och därför är ledande och avslutande mellanslag förbjudna). Mer utveckling är nödvändig om onödiga ledande nollor ska uteslutas (det vill säga förbjuda "03ms" men tillåta "0ms") och om andra tal än naturliga ska tillåtas (t.ex. "5.2ms" eller "-7s").

Relaterade artiklar