在打字稿模块中扩展全局类型(例如 "Window")

Extending global types (e.g. "Window") inside a typescript module

如果您使用打字稿编写,并且不使用模块,则可以扩展全局 Window 对象。例如,这样编译:

interface Window {
    myCounter: number;
}

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

function outputLoadingDetails() {
    console.log(`myCounter= ${window.myCounter}`)
}

但是如果我在函数 outputLoadingDetails 前加上 export,看起来我正在将这个文件转换成一个模块。我现在在访问 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`
}

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

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

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

interface Window { mycounter:number; }
window=Window;
window.myCounter = window.myCounter || 0;
++window.myCounter; 

我认为这可能有效,但我不确定

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

declare global {
    interface Window {
        myCounter: number;
    }
}

Global scope can be augmented from modules using a declare global declarations

更多信息here


** 确保文件被视为模块(具有 importexport 语句,如果没有 - 您可以添加空 export {}

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

这是我的解决方案:


interface customWindow extends Window {
  customProperty?: any;
}

declare const window: customWindow;

/* ... */

window.customProperty