类型为 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类型的多个值?

如何使用错误消息中指定的 tbspaceid tableid 在 DB2 中查找表和列

如何在 TypeScript 中进行运行时类型转换?