如何在子对象中使用 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.id
或 mail.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' }
})
我对编程和打字稿还是很陌生。 我希望我能合理解释我的问题,不幸的是我在网上找不到解决方案。
我有一个这样的电子邮件值变量:
contactId: string | undefined;
from: string;
to: string;
cc: string;
send?: boolean;
我有一个经常使用的 sendMail
函数,我想保留它而不是创建两个新函数。
此 sendMail
函数获取传递给它的 mail
对象,然后使用这些值发送邮件。
现在的问题是有时值在 mail
中,有时在 mail.mutateMail
中。
例如,如果我需要邮件的 ID,我可以从 mail.id
或 mail.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' }
})