如何通过TypeScript类型系统判断字符串是否全小写/全大写(非运行时检查)
实现方案
核心原理是利用TypeScript内置的Uppercase<T>、Lowercase<T>工具类型配合模板字面量类型特性,将输入的字符串类型和它的大小写转换结果做全等校验,全程在编译阶段完成,无任何运行时代价。
1. 定义基础校验工具类型
// 校验字符串类型是否为全大写 type IsAllUppercase<T extends string> = T extends Uppercase<T> ? true : false; // 校验字符串类型是否为全小写 type IsAllLowercase<T extends string> = T extends Lowercase<T> ? true : false;
2. 基础使用示例
// 全大写校验 type Test1 = IsAllUppercase<'HELLO'> // 推导结果为 true type Test2 = IsAllUppercase<'Hello'> // 推导结果为 false type Test3 = IsAllUppercase<'123ABC_$%'> // 推导结果为 true,非字母字符不影响校验结果 // 全小写校验 type Test4 = IsAllLowercase<'hello'> // 推导结果为 true type Test5 = IsAllLowercase<'Hello'> // 推导结果为 false type Test6 = IsAllLowercase<'hello123_$%'> // 推导结果为 true
3. 封装入参约束函数
如果需要在函数入参阶段就强制要求传入全大写/全小写字符串,可以直接用上述类型做约束,编译不匹配就会直接报错,不需要额外写运行时校验逻辑:
// 要求入参必须是全大写字符串 function handleUppercaseStr<T extends string>(str: IsAllUppercase<T> extends true ? T : never) { // 内部业务逻辑 } handleUppercaseStr('HELLO') // 正常通过编译 handleUppercaseStr('Hello') // 编译阶段直接报类型不匹配错误
注意:只有字面量字符串类型才能被正确校验,如果变量的类型被推导为通用
string,无法触发精准校验,可以通过as const声明将变量类型收窄为字面量类型即可:const str1 = 'HELLO' // 自动推导为'HELLO'字面量,可正常校验 const str2 = 'HELLO' as string // 类型为通用string,校验结果会推导为boolean const str3 = 'HELLO' as const // 显式收窄为字面量类型,可正常校验
内容的提问来源于stack exchange,提问作者Gajus
相关产品推荐
相关产品推荐

