TypeScript:模板文字类型不排除空格

TypeScript: Template Literal Type doesn't exclude spaces

提问人:Chriss 提问时间:10/20/2022 最后编辑:Chriss 更新时间:11/19/2023 访问量:265

问:

如何声明禁止中间有空格的模板文字类型?

这就是我所拥有的,但它允许数字和单位之间有空格。

 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 游乐场

TypeScript 字符串

评论

0赞 mahooresorkh 10/20/2022
你试过吗?似乎如果您使用泛型类型,问题就会消失。type Duration<T extends number> = `${T}${'ms' | 's'}`
0赞 captain-yossarian from Ukraine 10/20/2022
我认为打字稿不支持它,就像你所期望的那样。但是,我们可以对函数参数使用打字稿推理。看这里
0赞 merryweather 10/20/2022
这是 TypeScript :) 中的已知错误
0赞 Chriss 10/20/2022
你有源/票证 ID 吗?
2赞 jcalz 10/21/2022
有问题的问题是 ms/TS#46109。你想把它作为问题的答案吗?或者您主要在寻找解决方法(如上面提到的通用帮助程序函数)。让我知道(并在您的回复中提及@jcalz以便我收到通知)

答:

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”),则需要进行更多阐述。