当前位置: 首页 > 知识库问答 >
问题:

如何在Typescript中定义正则表达式匹配的字符串类型?

邹高峻
2023-03-14

是否可以定义一个包含字符串格式信息的接口?以以下为例:

interface timeMarkers{
    markerTime: string[]        
};

例如:

{
   markerTime: ["0:00","1:30", "1:48"]                   
}

我的问题:有没有一种方法来定义markerTime的类型,使得字符串值必须始终匹配此正则表达式,而不是将其声明为简单的string[]并从那里开始?

var reg=/[0-9]?[0-9]:[0-9][0-9]/;


共有3个答案

太叔京
2023-03-14

根据@bela53的答案,但要简单得多,我们可以做一个非常简单的解决方案,类似于@Titian,但没有缺点:

type HourPrefix = '0'|'1'|'2';
type MinutePrefix = HourPrefix | '3'|'4'|'5';
type Digit = MinutePrefix |'6'|'7'|'8'|'9';

type Time = `${HourPrefix | ''}${Digit}:${MinutePrefix}${Digit}`

const validTimes: Time[] = ["00:00","01:30", "23:59", "16:30"]
const invalidTimes: Time[] = ["30:00", "23:60", "0:61"] // all emit error
慎俊艾
2023-03-14

在正则表达式类型对语言可用之前,现在可以在TS 4.1中使用模板文本类型。

让我参考这个问题示例,并说明如何建模一个时间受限的字符串类型,称为时间。这里进行简化。

Array.from({length:24},(v,i)=> i).reduce((acc,cur)=> `${acc}${cur === 0 ? "" : "|"}'${String(cur).padStart(2, 0)}'`, "type HH = ")
Array.from({length:60},(v,i)=> i).reduce((acc,cur)=> `${acc}${cur === 0 ? "" : "|"}'${String(cur).padStart(2, 0)}'`, "type MM = ")
type HH = '00'|'01'|'02'|'03'|'04'|'05'|'06'|'07'|...|'22'|'23'
type MM = '00'|'01'|'02'|'03'|'04'|'05'|'06'|'07'|...|'58'|'59'
type Time = `${HH}:${MM}`

就这么简单。

const validTimes: Time[] = ["00:00","01:30", "23:59", "16:30"]
const invalidTimes: Time[] = ["30:00", "23:60", "0:61"] // all emit error

下面是一个实时代码示例,您可以使用时间

周奇文
2023-03-14

没有办法定义这样的类型。GitHub上有一个支持这一点的提议,但目前似乎不是优先事项。投票表决,也许团队会在未来的版本中包含它。

编辑

从4.1开始,您可以定义验证字符串的类型,而无需实际定义所有选项:

type MarkerTime =`${number| ''}${number}:${number}${number}`

let a: MarkerTime = "0-00" // error
let b: MarkerTime = "0:00" // ok
let c: MarkerTime = "09:00" // ok

游乐场链接

 类似资料:
  • 问题内容: 我想搭配以下 com.my.company。 moduleA .MyClassName com.my.company。 moduleB .MyClassName com.my.company。 anythingElse .MyClassName 但 不是 以下 com.my.company。 核心 .MyClassName 我当前的简单正则表达式模式是: 因此,基本上,我该如何匹配其他

  • 问题内容: 我在尝试将我的javascript regex经验转移到Python时遇到了麻烦。 我只是想让它工作: …但是它打印无。如果我做: 它匹配…默认情况下是否匹配字符串的开头?当匹配时,如何使用结果? 我如何进行第一场比赛?是否有比python网站提供的文档更好的文档? 问题答案: 隐式添加到您的正则表达式的开头。换句话说,它仅在字符串的开头匹配。 将在所有位置重试。 一般来说,建议您在需

  • 问题内容: 我在用Python将字符串中的数字匹配时遇到麻烦。尽管应该明确匹配,但甚至不匹配 或仅匹配。我的监督在哪里? 问题答案: 阅读文档:http : //docs.python.org/2/library/re.html#re.match 如果在零个或多个字符 开头 的 字符串 您要使用(或)

  • 我正在尝试编写一个bash脚本,其中包含一个函数,因此当给定一个,,etc.文件它使用带有相关开关的tar来解压缩文件。 我使用if-elif-then语句来测试文件名的结尾,但我无法使用regex元字符使其匹配。 为了节省不断重写脚本,我在命令行中使用“test”,我认为下面的语句应该可以工作,我已经尝试了括号、引号和元字符的每一个组合,但仍然失败。 我相信问题很简单,我到处都找过了,但我不知道

  • 问题内容: 我会在开头提到这个问题,尽管我离正则表达式专家很远,但是它们对我来说并不完全陌生。对于我来说,构建正则表达式来搜索特定字符串中的模式通常不是问题,但是我有一个(也许是?)独特的情况。 我有一组价值观,例如: 028938 DEF567987 390987.456 GHI345928.039 我想匹配一组特定的字符串,例如: 完全由6位数字组成的字符串 字符串,由正好6位数字,十进制组成

  • 我正在arround制作一个与字符串的某个块匹配的正则表达式,问题是它包含许多相似的块,并且没有清楚地分开,所以我不知道如何停止正则表达式。 字符串的例子 所以我要做的是匹配并只选择第一个A1。到目前为止,我所做的是: