如何定义匹配func(任意数量逗号分隔参数)的TypeScript类型?
实现符合要求的TypeScript匹配类型
要精准匹配func(...)格式,且括号内必须是任意数量逗号分隔参数的字符串,你可以通过递归模板字符串类型实现,替代原本过于宽松的func(${string})类型。
1. 定义单个参数的合法类型
先限制单个参数不能包含逗号或右括号(如果有更具体的参数格式要求,比如仅允许数字,可直接修改此类型):
// 排除包含逗号、右括号的字符串,确保单个参数合法 type Param = string extends `${infer P},${string}` ? never : string extends `${infer P})` ? never : P;
2. 定义多参数的递归列表类型
通过递归实现「单个参数」或「参数+逗号+空格+参数列表」的重复结构,覆盖1个及多个参数的场景:
// 支持1个或多个逗号分隔的参数 type ParamList = `${Param}` | `${Param}, ${ParamList}`;
3. 最终的完整匹配类型
组合成func(参数列表)的完整格式:
type FuncCall = `func(${ParamList})`;
测试验证
以下示例可以验证类型的有效性:
// 合法示例:全部通过类型检查 const valid1: FuncCall = 'func(1, 2, 3, 4, 5)'; const valid2: FuncCall = 'func(1, 2, 3)'; const valid3: FuncCall = 'func(userName, age, isActive)'; // 非法示例:全部触发类型错误 const invalid1: FuncCall = 'func()'; // 括号内无参数 const invalid2: FuncCall = 'func(1,,2)'; // 存在空参数位 const invalid3: FuncCall = 'func(1 2, 3)'; // 参数内包含空格(若需允许参数带空格,需调整Param类型) const invalid4: FuncCall = 'func(1, 2) extra'; // 括号后存在多余内容
可选调整:支持空参数场景
如果需要允许func()这种空参数的格式,只需修改ParamList类型:
type ParamList = '' | `${Param}` | `${Param}, ${ParamList}`; type FuncCall = `func(${ParamList})`;
补充说明
- 若参数有特定格式要求(比如仅允许数字、标识符),可替换
Param类型,例如限制为数字:type Param =${number}``。 - TypeScript模板字符串的递归深度默认限制为1000层,完全覆盖常规参数数量的需求。
内容的提问来源于stack exchange,提问作者cokakola
相关产品推荐
相关产品推荐

