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").
