TypeScript能否定义含任意数量任意顺序子串字面量的泛型字符串类型?
实现任意数量、任意顺序子串的字符串字面量类型约束
完全可以实现!我们可以用TypeScript的递归泛型构建一个通用类型,强制目标字符串字面量包含指定列表中的所有子串,无需关心子串顺序。
核心实现代码
type ContainsAllSubstrings<Substrings extends string[], T extends string> = Substrings extends [infer First extends string, ...infer Rest extends string[]] ? T extends `${string}${First}${string}` ? ContainsAllSubstrings<Rest, T> : never : T;
工作原理
- 泛型
Substrings接收必须包含的子串数组,T是待检查的目标字符串字面量 - 递归拆解子串数组:每次取出第一个子串
First,检查T是否包含该子串 - 若包含则继续递归检查剩余子串;若不包含,直接返回
never触发类型错误 - 当所有子串检查通过(子串数组为空),返回原字符串
T,表示类型合法
SQL参数化键的实际使用示例
比如要确保SQL语句包含:userId和:orderId两个参数:
// 定义必须包含的参数键列表 type RequiredParams = [':userId', ':orderId']; // 合法SQL:包含所有参数,类型正常通过 type ValidSQL = ContainsAllSubstrings<RequiredParams, 'SELECT * FROM orders WHERE id = :orderId AND user_id = :userId'>; // 非法SQL:缺少:userId,类型被推断为never,触发类型错误 type InvalidSQL = ContainsAllSubstrings<RequiredParams, 'SELECT * FROM orders WHERE id = :orderId'>;
注意点
- 该类型不关心子串的出现顺序,只要所有子串存在即可
- 仅支持字符串字面量类型,动态生成的字符串无法在编译期做此类约束
内容的提问来源于stack exchange,提问作者Nick Schmitt
相关产品推荐
相关产品推荐

