我在为重载函数编写包装程序时遇到了困难。
我正在包装的函数是SendGrid电子邮件发送功能。该函数重载如下(简化):
declare class MailService {
send(data: Email): foo;
send(data: Email[]): foo;
}我想编写一个可以接受Email或Email[]的函数。但是当我这样做的时候,它抱怨没有过载与调用匹配:
function sendEmailWrapper1(data: Email | Email[]) {
sendGrid.send(data)
}然而,这样做是可行的:
function sendEmailWrapper2(data: Email | Email[]) {
if ('length' in data) {
sendGrid.send(data)
} else {
sendGrid.send(data)
}
}我认为Email | Email[]不是send(data: Email)或send(data: Email[])的有效输入,并且类型记录没有意识到重载意味着sendGrid.send(data)应该是有效的(实际上,如果if和else分支可以有相同的代码,并且是有效的,这就使得即使没有if语句也应该能够认识到该语句是有效的,因为类型记录是编译的,而且实际上不会指导运行时代码执行根据类型进行不同的函数调用)。
我的两个问题:
sendEmailWrapper1不能编译但sendEmailWrapper2可以工作的一个很好的原因?谢谢!
https://stackoverflow.com/questions/60384023
复制相似问题