如何映射TypeScript搜索字段与数据库列实现动态查询?
解决API搜索字段与数据库列的自动匹配问题
核心思路是建立前端搜索字段与数据库列的类型安全映射表,彻底摆脱if-else/switch,后续新增字段只需要更新映射表和类型定义即可,完全符合扩展性要求。
步骤1:定义类型安全的映射关系
先把前端允许的搜索字段和对应的数据库列做一一映射,同时通过TypeScript的类型检查确保映射完全覆盖所有允许的字段,避免遗漏:
// Restrict user to search these fields only type SearchFieldType = 'name' | 'memberNo' | 'email' | 'companyName'; // 建立前端字段 -> 数据库列的映射(类型安全) const searchFieldToDbCol = { name: 'username', memberNo: 'member_no', email: 'email', companyName: 'company_name' } as const; // 自动校验映射是否覆盖所有SearchFieldType,遗漏字段会直接报错 type CheckFieldCoverage = Exclude<SearchFieldType, keyof typeof searchFieldToDbCol>; const _ensureAllFieldsMapped: CheckFieldCoverage = undefined!;
步骤2:转换搜索字段为数据库列
不管是单个还是多个搜索字段,直接通过映射表获取对应的数据库列,无需任何条件判断:
// 转换单个搜索字段 function getSingleDbColumn(field: SearchFieldType): typeof searchFieldToDbCol[keyof typeof searchFieldToDbCol] { return searchFieldToDbCol[field]; } // 转换多个搜索字段 function getMultipleDbColumns(fields: SearchFieldType[]): typeof searchFieldToDbCol[keyof typeof searchFieldToDbCol][] { return fields.map(field => searchFieldToDbCol[field]); }
步骤3:构建数据库查询
以构建查询条件为例,直接用转换后的数据库列名生成查询逻辑,适配不同的数据库操作场景(比如ORM、原生SQL):
// 示例:处理多字段搜索参数,生成数据库查询条件 function buildSearchQuery(searchParams: Partial<Record<SearchFieldType, string>>) { return Object.entries(searchParams).reduce((query, [field, value]) => { const dbColumn = searchFieldToDbCol[field as SearchFieldType]; // 根据实际需求调整查询规则(比如模糊匹配、精确匹配) query[dbColumn] = { contains: value }; return query; }, {} as Record<string, { contains: string }>); } // 调用示例:假设管理员传入{ name: "张三", email: "zhangsan@example.com" } const query = buildSearchQuery({ name: "张三", email: "zhangsan@example.com" }); // 输出:{ username: { contains: "张三" }, email: { contains: "zhangsan@example.com" } }
方案优势
- 无冗余条件判断:全程无需if-else/switch,代码简洁易维护
- 类型安全保障:新增字段时,只要忘记更新映射表,TypeScript会直接抛出错误,提前规避遗漏问题
- 扩展性极强:后续新增搜索字段,只需要在
SearchFieldType和searchFieldToDbCol中添加对应项即可,无需修改其他业务逻辑
内容的提问来源于stack exchange,提问作者EQ0920
相关产品推荐
相关产品推荐

