TypeScript中带类型转换的查询字符串解析:求更优实现方案
如何将查询字符串解析为保留原始数据类型的嵌套对象/数组
你可以直接基于qs库扩展,通过递归转换逻辑处理嵌套对象和数组——qs本身就支持解析嵌套结构,不用自己从零实现复杂的字符串拆分逻辑,只需要加上类型转换的递归处理即可。
完整实现代码
import qs from 'qs'; const parseQueryString = (str: string | null | undefined): object => { const convertValue = (value: any): any => { // 转换布尔值字符串 if (value === 'true') return true; if (value === 'false') return false; // 转换纯数字字符串:先验证是否为纯数字格式,避免误转带数字的普通字符串 if (typeof value === 'string') { const num = Number(value); if (!isNaN(num) && !isNaN(parseFloat(value))) { return num; } } // 递归处理嵌套对象和数组 if (typeof value === 'object' && value !== null) { if (Array.isArray(value)) { return value.map(convertValue); } return Object.fromEntries( Object.entries(value).map(([key, val]) => [key, convertValue(val)]) ); } // 其他类型直接返回 return value; }; // 先用qs解析嵌套结构和数组,再做全局类型转换 const parsedBase = qs.parse(str || '', { allowDots: true, // 支持 `filter.name=Alice` 这种点语法的嵌套对象 parseArrays: true, // 支持 `ids[]=1&ids[]=2` 这种数组格式 strictNullHandling: true // 可选:将字符串"null"转换为null类型 }); return convertValue(parsedBase); };
核心逻辑说明
- 嵌套结构解析:借助
qs.parse的allowDots和parseArrays配置,自动识别并解析嵌套对象(如a.b.c=123)、数组(如tags[]=js&tags[]=ts),省去手动拆分字符串的麻烦。 - 递归类型转换:
convertValue函数会遍历所有层级的属性,将字符串格式的布尔值、纯数字转换为对应原始类型,同时递归处理嵌套的对象和数组。 - 防误转换处理:判断数字时先验证字符串是否为纯数字格式,避免把
"123abc"这类带数字的普通字符串误转为数字。
示例测试
输入查询字符串:
skip=0&take=10&filter.active=true&ids[]=1&ids[]=2&user.name=John
解析后得到的对象:
{ skip: 0, take: 10, filter: { active: true }, ids: [1, 2], user: { name: "John" } }
内容的提问来源于stack exchange,提问作者Loudrous
相关产品推荐
相关产品推荐

