TypeScript处理union类型string | string[]时如何查询对应数据库记录
核心优化方案
统一参数类型为数组,消除分支重复逻辑
你只需要在函数开头把入参统一格式化为数组,后续就不需要区分单个/多个场景,共用同一段处理逻辑即可,同时还能修复原有代码里的隐性bug:循环分支中错误地把整个toEmail数组传给了单邮箱查询方法getUserByEmail。
优化后代码如下:
public async sendEmail( toEmail: string | string[], ): Promise<void> { // 统一转为数组格式,无需再区分单/多场景 const emails = Array.isArray(toEmail) ? toEmail : [toEmail]; // 共用同一段处理逻辑 for (const email of emails) { const user = await this.userRepository.getUserByEmail(email); await checkIfPaymentMade(user); } }
该方案的优势:
- 完全消除重复代码,逻辑仅需要维护一份
- 入参兼容逻辑收拢在函数开头,后续迭代更易维护
- 修复了原有代码循环分支的参数传错问题
进阶性能优化
如果你的userRepository支持批量邮箱查询,可以进一步减少数据库请求次数,避免循环查库的IO开销:
public async sendEmail( toEmail: string | string[], ): Promise<void> { const emails = Array.isArray(toEmail) ? toEmail : [toEmail]; // 一次查询所有对应用户,减少IO次数 const users = await this.userRepository.getUsersByEmails(emails); for (const user of users) { await checkIfPaymentMade(user); } }
内容的提问来源于stack exchange,提问作者Karry Bee
相关产品推荐
相关产品推荐

