如何在TypeScript中定义约束为纯小写单词的类型?
TypeScript 纯小写单词类型实现方案
你之前的写法确实不符合要求:直接把正则字面量写在类型声明位置,实际定义的是匹配该正则实例的类型,完全无法对字符串内容做约束。
TypeScript 4.1 版本引入的模板字面量类型,结合递归类型可以实现你的需求,具体实现如下:
// 第一步:定义所有小写英文字母的联合类型 type LowercaseLetter = 'a'|'b'|'c'|'d'|'e'|'f'|'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z' // 第二步:递归定义纯小写单词类型 // 规则:要么是单个小写字母,要么是小写字母开头 + 剩余部分同样符合纯小写单词规则 type LowercaseWord = LowercaseLetter | `${LowercaseLetter}${LowercaseWord}`
效果验证
// 合法示例,无类型报错 const valid1: LowercaseWord = 'hello' const valid2: LowercaseWord = 'typescript' const valid3: LowercaseWord = 'a' // 非法示例,TS会直接抛出类型错误 const invalid1: LowercaseWord = 'Hello' // 包含大写字母 const invalid2: LowercaseWord = 'hello123' // 包含数字 const invalid3: LowercaseWord = 'hello_world' // 包含下划线等特殊字符 const invalid4: LowercaseWord = '' // 空字符串
常见调整方案
- 如果你需要允许空字符串作为有效值,只需要修改
LowercaseWord的定义,增加空字符串的联合项即可:type LowercaseWord = '' | LowercaseLetter | `${LowercaseLetter}${LowercaseWord}` - 注意不要误用TS内置的
Lowercase<T>工具类型:它的作用是将传入的字符串字面量类型转换为小写形式,无法直接对任意输入的字符串做全小写校验,Lowercase<string>等价于普通的string类型,没有约束效果。 - 该方案默认支持最长几百到上千字符长度的单词,完全覆盖日常业务使用场景,如果有超长字符串的校验需求,可以调整TS配置的递归深度上限。
内容的提问来源于stack exchange,提问作者wyc
相关产品推荐
相关产品推荐

