在TypeScript

时间:2018-04-12 09:30:32

标签: typescript declare

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

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

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

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

一切都适用于Chrome - 我更喜欢开发的浏览器 - 但后来我发现部署后Firefox的问题。

问题是event在Chrome的全局范围内可用,并且在默认的打字稿 lib.d.ts 文件中也定义如下。

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

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

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

1 个答案:

答案 0 :(得分: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,这至少会在lint阶段发现这一点。