如何在子对象中使用 Typescript 值?

how to use Typescript values in subobject?

我对编程和打字稿还是很陌生。 我希望我能合理解释我的问题,不幸的是我在网上找不到解决方案。

我有一个这样的电子邮件值变量:

  contactId: string | undefined;
  from: string;
  to: string;
  cc: string;
  send?: boolean;

我有一个经常使用的 sendMail 函数,我想保留它而不是创建两个新函数。 此 sendMail 函数获取传递给它的 mail 对象,然后使用这些值发送邮件。 现在的问题是有时值在 mail 中,有时在 mail.mutateMail 中。 例如,如果我需要邮件的 ID,我可以从 mail.idmail.mutateMail.id 获取它。 但它总是要么,要么,而不是两者。 这也有效我不能像这样使函数类型安全。

其实我需要这样的东西:

export const sendMail =
  (mail: ValuesType, mail.mutateMail: ValuesType): AppThunk =>
{
 const mailId = !mail.mutateMail ? mail.id : mail.mutateMail.id;
 console.log(mailId)
}

但这当然行不通。

谁能告诉我在这种情况下使函数类型安全的最佳做法是什么?

But it is always either or, not both.

您描述的是 union

您的价值可以是两件事之一。所以你在联盟中有两个成员。

type ValuesOrNested =
    (ValuesType & { mutateMail?: never }) | { mutateMail: ValuesType }

也就是说值可以是两种类型之一。

第一个成员类型是您的 ValuesType 对象,它没有 mutateMail 属性。第二个成员类型可以是具有 mutateMail 属性 的对象,即 ValuesType.

现在您可以使用该类型作为参数:

export const sendMail =
  (mail: ValuesOrNested): AppThunk =>
{
 const mailId = !mail.mutateMail ? mail.id : mail.mutateMail.id;
 console.log(mailId)
}

而且函数应该允许其中一种格式,但不能同时使用两种格式:

// These work
sendMail({ id: 1, contactId: 'qwe', from: 'a', to: 'b', cc: 'd' })
sendMail({ mutateMail:  { id: 1, contactId: 'qwe', from: 'a', to: 'b', cc: 'd' } })

// error as expected
sendMail({
    id: 1, contactId: 'qwe', from: 'a', to: 'b', cc: 'd',
    mutateMail: { id: 1, contactId: 'qwe', from: 'a', to: 'b', cc: 'd' }
})

Playground