在打字稿模块中扩展全局类型(例如 "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
** 确保文件被视为模块(具有 import
或 export
语句,如果没有 - 您可以添加空 export {}
)
我不喜欢修改 global
声明,因为修改会出现在其他文件中。
这是我的解决方案:
interface customWindow extends Window {
customProperty?: any;
}
declare const window: customWindow;
/* ... */
window.customProperty
如果您使用打字稿编写,并且不使用模块,则可以扩展全局 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
** 确保文件被视为模块(具有 import
或 export
语句,如果没有 - 您可以添加空 export {}
)
我不喜欢修改 global
声明,因为修改会出现在其他文件中。
这是我的解决方案:
interface customWindow extends Window {
customProperty?: any;
}
declare const window: customWindow;
/* ... */
window.customProperty