【发布时间】:2020-06-08 13:28:45
【问题描述】:
我在为重载函数编写包装器时遇到问题。
我包装的函数是the SendGrid email sending function。该函数像(简化)一样重载:
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[]) 的有效输入,并且 Typescript 没有意识到重载意味着 sendGrid.send(data) 应该是有效的(而且,确实,如果if 和else 分支可以具有相同的代码并且是有效的,那么看起来Typescript 应该能够意识到即使没有if 语句来帮助它推断类型,该语句也是有效的Typescript 只是编译时的,实际上不会指导运行时代码执行以根据类型进行不同的函数调用)。
我的两个问题:
- 在这种情况下,最佳做法是什么?
- 这只是 Typescript 编译器的一个缺点,还是有充分的理由
sendEmailWrapper1无法编译但sendEmailWrapper2可以工作?
谢谢!
【问题讨论】:
-
MailService的类型定义在哪里? IE。它来自什么npm install xxx? -
我在 GitHub 中链接了该文件,该文件在我的问题描述顶部进行了定义——它是 SendGrid Node v3 邮件库。 @sendgrid/邮件。
标签: typescript