【问题标题】:Undeclare variable 'event' in TypeScript在 TypeScript 中取消声明变量“事件”
【发布时间】:2018-04-12 09:30:31
【问题描述】:

我经常遇到 TypeScript 问题,并使用名为 event 的参数来引用事件。

问题是当我在方法中使用它时,却忘记将其声明为输入参数,请参阅:

addItem = () =>
{
    var popup = new Popup();

    popup.show( event ); // this function i.e. needs a default click event forwarded
}

在 Chrome 中一切正常——我最喜欢的开发浏览器——但在部署后我发现 Firefox 出现问题。

问题是 event 在 Chrome 的全局范围内可用,并且在默认的 typescript lib.d.ts 文件中也是这样定义的。

在 99.99% 的情况下,我不想在全局范围内使用 event - 我认为这是一种反模式。

我可以在 TypeScript 中取消声明全局变量吗?

  • 我不想更改 lib.d.ts,因为我需要在我工作过的所有环境中修复此问题
  • 我当然可以默认为此参数使用不同的名称,即 evt,但我更喜欢使用最具描述性的名称

【问题讨论】:

    标签: typescript declare


    【解决方案1】:

    虽然您可以扩充任何界面,包括 Window,但您无法更改预先存在的字段的类型。例如,这不起作用:

    interface Window {
        event: never; // Error: redeclarations must have the same type
    }
    

    如果您的代码库适合启用strictNullChecks,那么使用全局event 属性将失败,因为它的类型被声明为Event | undefined

    所以,在启用 strictNullChecks 的情况下,这将出错:

    document.onload = () => {
        console.info(event.target); // Error: event can be undefined
    };
    

    处理程序上的命名事件参数在其类型中不会有undefined,此错误可能会提示您添加参数。

    但是如果你不能启用 strictNullChecks,就没有办法强制了。

    TSLint 可能很快会添加一条禁止这些全局变量的规则,请参阅 the current PR,这至少会在 linting 阶段发现这一点。

    【讨论】:

    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 2022-01-15
    • 2015-03-14
    • 2018-01-05
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多