You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何TypeScript允许在函数签名中用MouseEvent替代Event?

TypeScript接口方法参数类型不匹配为何未报错?

问题原因

你遇到的情况是TypeScript默认的函数参数双向协变规则导致的。

在默认编译配置下,TypeScript对函数参数的兼容性检查是双向协变的——既允许参数类型"更宽泛"(符合逆变规则),也允许"更具体"(符合协变规则)。你的代码中,接口IManager要求pass方法接收Event类型参数,但实现时用了更具体的MouseEvent,这种参数类型收窄的写法,在双向协变规则下会被判定为兼容,因此编译时不会报错。

但这种写法存在运行时风险:当你调用manager.pass(new Event("Some"))时,传入的是Event实例,它并没有clientX/clientY属性,运行时会抛出undefined相关的错误。

解决方法

要避免这类类型不安全的问题,只需启用TypeScript的strictFunctionTypes编译选项:

  • 该选项会强制函数参数遵循逆变规则:只有当实现函数的参数类型比接口要求的更宽泛(或相同)时,才会被判定为兼容。
  • 启用后,你的代码会立即触发编译错误,提示pass方法的参数类型MouseEvent无法匹配接口要求的Event,从根源上阻止这类错误。

你可以在tsconfig.json中配置:

{
  "compilerOptions": {
    "strictFunctionTypes": true
    // 其他配置...
  }
}

内容的提问来源于stack exchange,提问作者Sonny D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:35:06