在打字稿模块中扩展"窗口"

And*_*erd 3 typescript

如果您使用typescript编写,并且未使用模块,则可以扩展全局Window对象.例如,这编译:

interface Window {
    myCounter: number;
}

window.myCounter = window.myCounter || 0;
++window.myCounter;

function outputLoadingDetails() {
    console.log(`myCounter= ${window.myCounter}`)
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我前缀功能outputLoadingDetailsexport,看来我这个文件转换成一个模块.我现在访问时遇到编译器错误window.myCounter.

interface Window {
    myCounter: number;
}

window.myCounter = window.myCounter || 0; // ERROR: property 'MyCounter' does not exist on type `Window`
++window.myCounter;                       // ERROR: property 'MyCounter' does not exist on type `Window`

export function outputLoadingDetails() {
    console.log(`myCounter= ${window.myCounter}`)  // ERROR: property 'MyCounter' does not exist on type `Window`
}
Run Code Online (Sandbox Code Playgroud)

看来我的接口声明不再扩展全局Window类型.

我找到的一个解决方法是将接口声明放入一个单独的*.d.ts文件中,并从我的模块中引用它.

但现在我很好奇.有什么方法可以Window在模块代码中扩展接口吗?

小智 26

我不喜欢修改global声明,因为修改会出现在其他文件中。

这是我的解决方案:


interface customWindow extends Window {
  customProperty?: any;
}

declare const window: customWindow;

/* ... */

window.customProperty

Run Code Online (Sandbox Code Playgroud)

  • 当您需要特定文件的特定属性时,效果会更好。 (3认同)

Ale*_* L. 11

是的,您只需要将接口包装到全局声明中:

declare global {
    interface Window {
        myCounter: number;
    }
}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里

  • 对于任何想知道为什么您的 `.d.ts` 文件不起作用的人:如果文件中没有导出,请将 `export {}` 添加到您的文件中。这使 TS 将您的文件识别为模块。来源:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-1-8.html#example-6 (8认同)