如何约束TypeScript模板字面量类型仅允许纯数字字符后缀?
如何在TypeScript中强制
Code字段为SLA前缀加纯数字字符? 原类型定义存在的问题:
interface Message{ Code: `SLA${number}`; }
使用${number}会匹配所有合法的JavaScript数字格式,包括负数(SLA-102)、十六进制(SLA0x10)甚至科学计数法,无法满足仅允许阿拉伯数字字符的需求。
解决方案
1. 匹配任意长度的纯数字(至少1位)
通过递归类型定义纯数字序列:
// 单个数字字符类型 type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'; // 一个或多个数字字符的递归类型 type Digits = Digit | `${Digit}${Digits}`; interface Message { Code: `SLA${Digits}`; }
这个定义会强制Code必须是SLA开头,后跟至少一位0-9的数字字符。SLA123、SLA01000这类值合法,而SLA-102、SLA0x10、SLA(无数字)都会被TypeScript校验拦截。
2. 固定长度的纯数字(按需选择)
如果需要限制数字部分的位数(比如固定3位),可以直接拼接对应数量的Digit类型:
type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'; interface Message { Code: `SLA${Digit}${Digit}${Digit}`; }
此时仅允许SLA后跟3位数字,例如SLA123、SLA001。
校验示例
// 合法 const valid1: Message = { Code: 'SLA123' }; const valid2: Message = { Code: 'SLA01000' }; // 非法(TypeScript会报错) const invalid1: Message = { Code: 'SLA-102' }; const invalid2: Message = { Code: 'SLA0x10' }; const invalid3: Message = { Code: 'SLA' };
内容的提问来源于stack exchange,提问作者Kilian
相关产品推荐
相关产品推荐

