如何在打字稿中覆盖window.function?



我正在尝试记录自动调用方法的时间。(我从 https://stackoverflow.com/a/5034657/11188822 那里得到了编码(

augment(withFn) {
let name, fn;
for (name in window) {
fn = window[name];
if (typeof fn === 'function') {               
window[name] = (function(n, f) {   // I get an error here.
const args = arguments;
return function() {
withFn.apply(this, args);
return fn.apply(this, arguments);
};
})(name, fn);
}
}
}

并称呼这个。

this.augment(function(name, fn) {
console.log('calling ' + name);
});

我收到错误

src/app/app.component.ts(81,17( 中的错误:错误 TS2740:类型"(( => any"缺少类型"窗口"中的以下属性:Blob、文本解码器、文本编码器、URL 等 232 个属性。

如何覆盖窗口功能?

TypeScript 将你的window[name]属性视为一个Window接口,应该包含BlobTextDecoderTextEncoder等。

原因是Window接口包含动态属性的定义:

interface Window extends EventTarget, WindowTimers, ... {
...
[index: number]: Window;
}

表示对框架(window[0]window[1]等(中窗口对象的引用。

您可以扩展现有的Window界面以告知它您的案例:

declare global {
interface Window {
[index: string]: () => any; // or just any
}
}

此外,您必须明确表示变量let namestring的类型:

let name: string

以下是完整代码:

app.component.ts

export class AppComponent {
...
ngOnInit() {
this.augment(function(name, fn) {
console.log('calling ' + name);
});
}
augment(withFn) {
let name: string, fn;
for (name in window) {
fn = window[name];
if (typeof fn === 'function') {
window[name] = (function (n, f) {
const args = arguments;
return function () {
withFn.apply(this, args);
return fn.apply(this, arguments);
};
})(name, fn);
}
}
}
}
declare global {
interface Window {
[index: string]: () => any;
}
}

注意:总有一些更简单的方法可以防止 TypeScript 抱怨:

禁止显示错误:

// @ts-ignore
window[name] = (function(n, f) {

使用any关键字:

(window[name] as any) = (function(n, f) {

(<any>window[name]) = (function (n, f) {

最新更新