当我试图将邮件返回到源代码时,Typescript会抱怨

当我试图将邮件返回到源代码时,Typescript会抱怨,typescript,Typescript,这是我的密码 window.addEventListener('message', (e) => { e.source.postMessage('hi there, I hear you!', '*'); }); 这就是错误: [ts]无法调用其类型缺少调用签名的表达式。类型“((消息:any,targetOrigin:string,transfer?:any[])=>void)((消息:any,transfer?:any[])=>void)”没有兼容的呼叫签名 当我检查postMe

这是我的密码

window.addEventListener('message', (e) => {
  e.source.postMessage('hi there, I hear you!', '*');
});
这就是错误:

[ts]无法调用其类型缺少调用签名的表达式。类型“((消息:any,targetOrigin:string,transfer?:any[])=>void)((消息:any,transfer?:any[])=>void)”没有兼容的呼叫签名

当我检查
postMessage
时,它似乎是
窗口上的一个方法,并且具有签名:

declare function postMessage(
    message: any,
    targetOrigin: string,
    transfer?: any[]
): void;

那看起来很像我的电话签名。那么我的代码有什么问题吗?

e.source
的类型是
MessageEventSource

type MessageEventSource=WindowProxy | MessagePort | serviceforner

由于只有
WindowProxy
具有您正在使用的方法签名,因此您可以使用以下方法对其进行保护:

window.addEventListener('message', (e) => {
  if (!(e.source instanceof MessagePort) && !(e.source instanceof ServiceWorker)) {
    e.source.postMessage('hi there, I hear you!', '*');
  }
});

或者告诉TS您的
e.source
类型为
WindowProxy | Window

我在这里找到了解决方案:。圣诞节我希望TypeScript能提供更好的错误信息!要直接测试它是否是WindowProxy吗<代码>event.source instanceof Window
对我不起作用