提问人:Chriss 提问时间:10/20/2022 最后编辑:Chriss 更新时间:11/19/2023 访问量:265
TypeScript:模板文字类型不排除空格
TypeScript: Template Literal Type doesn't exclude spaces
问:
如何声明禁止中间有空格的模板文字类型?
这就是我所拥有的,但它允许数字和单位之间有空格。
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
答:
0赞
Matthias Falk
11/19/2023
#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
参见 TypeScript Playground。这只是禁止不需要的空间的解决方案。它说明了基本思想,即检查要解释为数字的子字符串是否以数字开头和结尾(因此禁止使用前导和尾随空格)。如果应排除不必要的前导零(即禁止“03ms”但允许“0ms”),并且应允许自然数字以外的数字(例如“5.2ms”或“-7s”),则需要进行更多阐述。
评论
type Duration<T extends number> = `${T}${'ms' | 's'}`