如何为字符串拼接后的列表定义TypeScript类型?
优化
itemsABjoined参数的类型定义 你可以通过定义递归模板字符串类型,精准约束itemsABjoined参数为ItemA或ItemB类型字面量用空格拼接而成的字符串,替代过于宽泛的string类型。
步骤1:定义拼接后的字符串类型
基于已有的ItemAB联合类型,递归定义允许单个或多个元素用空格分隔的字符串类型:
type ItemA = `${string}:${number}`; type ItemB = `${string}:${number},${number}`; type ItemAB = ItemA | ItemB; // 约束为:单个ItemAB,或多个ItemAB以空格连接的字符串 type ItemsABJoined = ItemAB | `${ItemAB} ${ItemsABJoined}`;
步骤2:修改函数参数类型
将itemsABjoined的类型替换为ItemsABJoined,同时为了让TypeScript正确推断返回值类型,配合类型断言(或添加运行时验证增强安全性):
function parseItemsAB(itemsABjoined: ItemsABJoined): ItemAB[] { return itemsABjoined.split(' ') as ItemAB[]; }
可选:增加运行时验证
由于TypeScript类型检查仅在编译时生效,若要确保运行时输入合法性,可添加验证逻辑:
// 类型守卫函数,验证字符串是否符合ItemAB格式 const isValidItemAB = (str: string): str is ItemAB => { const itemAPattern = /^[^:]+:\d+$/; const itemBPattern = /^[^:]+:\d+,\d+$/; return itemAPattern.test(str) || itemBPattern.test(str); }; function parseItemsAB(itemsABjoined: ItemsABJoined): ItemAB[] { const parts = itemsABjoined.split(' '); if (!parts.every(isValidItemAB)) { throw new Error("输入字符串包含非法格式的元素"); } return parts as ItemAB[]; }
额外说明
- 若需要支持空字符串输入,可调整
ItemsABJoined类型为:type ItemsABJoined = '' | ItemAB | `${ItemAB} ${ItemsABJoined}`; - 该类型定义会在编译时拦截不符合格式的输入,比如
"invalid:abc"或"a:1 b:2,3 c:xyz"这类非法字符串会触发TypeScript报错。
内容的提问来源于stack exchange,提问作者Evgeniy Pozdnyakov
相关产品推荐
相关产品推荐

