类型为 String 时如何在 DB 中查找项目 |使用打字稿联合类型的字符串 []
Posted
技术标签:
【中文标题】类型为 String 时如何在 DB 中查找项目 |使用打字稿联合类型的字符串 []【英文标题】:How to look for an item in DB when the type is String | String[] using typescript union types 【发布时间】:2021-12-28 10:46:33 【问题描述】:我正在调用一个方法sendEmail
,它向单个用户或一群用户发送电子邮件(电子邮件的类型是string | string[]
)
是否有更简洁/更好的方法来确定它是数组还是单个用户,以便我可以相应地在数据库中查找它?这段代码现在看起来很重复。
public async sendEmail(
toEmail: string | string[],
): Promise<void>
if (!Array.isArray(toEmail))
const user = await this.userRepository.getUserByEmail(toEmail);
await checkIfPaymentMade(user);
else
for (const email of toEmail)
const user = await this.userRepository.getUserByEmail(toEmail);
await checkIfPaymentMade(user);
【问题讨论】:
考虑这个tsplay.dev/mbG02W。Array.isArray
比 !Array.isArray
更容易阅读
【参考方案1】:
想到其他一些选项
-
将公共代码提取到自己的函数中。仍然有一些重复,但只有一行而不是辅助函数需要多长。
public async sendEmail(
toEmail: string | string[]
): Promise<void>
if (!Array.isArray(toEmail))
await doStuff(toEmail);
else
for (const email of toEmail)
await doStuff(email);
private async doStuff(toEmail: string): Promise<void>
const user = await this.userRepository.getUserByEmail(toEmail);
await checkIfPaymentMade(user);
-
让函数的主体只适用于独立的字符串。如果是数组,则递归。
public async sendEmail(
toEmail: string | string[],
): Promise<void>
if (Array.isArray(toEmail)
for (const email of toEmail)
await sendEmail(email)
else
const user = await this.userRepository.getUserByEmail(email);
await checkIfPaymentMade(user);
-
让函数的主体只适用于数组。如果不是数组,先转成一个。
public async sendEmail(
toEmail: string | string[],
): Promise<void>
const emailArray = Array.isArray(toEmail) ? toEmail : [toEmail];
for (const email of emailArray)
const user = await this.userRepository.getUserByEmail(email);
await checkIfPaymentMade(user);
【讨论】:
就个人而言,我喜欢第二种解决方案。可能值得考虑使用for await ... of
循环
我刚刚重新安排了我的帖子,所以你现在可能指的是第三个(这也是我的偏好)
是的,这也可能是样式问题,但我认为值得为 toEmail
创建新变量/常量以避免参数突变
是的,我可以看到不重新分配参数的好处。已更新。【参考方案2】:
如果您只想保持干燥,这里有一个选项:
TS Playground link
public async sendEmail (recipients: string | string[]): Promise<void>
for (const address of Array.isArray(recipients) ? recipients : [recipients])
const user = await this.userRepository.getUserByEmail(address);
await checkIfPaymentMade(user);
【讨论】:
以上是关于类型为 String 时如何在 DB 中查找项目 |使用打字稿联合类型的字符串 []的主要内容,如果未能解决你的问题,请参考以下文章
如何在 for in 循环中向下转换为 [String: String]?
在java项目中,在jsp传入一个值(日期),jsp和数据库都是string类型的,如何把传入的当前值减去一个月?
如何在maria DB中创建检查约束以检查char类型的多个值?