You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

工作原理

  1. 泛型Substrings接收必须包含的子串数组,T是待检查的目标字符串字面量
  2. 递归拆解子串数组:每次取出第一个子串First,检查T是否包含该子串
  3. 若包含则继续递归检查剩余子串;若不包含,直接返回never触发类型错误
  4. 当所有子串检查通过(子串数组为空),返回原字符串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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:46:11