首页 > 解决方案 > 如何在 Typescript 中覆盖 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' 缺少来自类型 'Window' 的以下属性:Blob、TextDecoder、TextEncoder、URL 和 232 更多.

如何覆盖窗口功能?

标签: typescriptcallback

解决方案


TypeScript 将您的window[name]属性视为Window应包含Blob,TextDecoder等的接口TextEncoder

原因是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 name的类型为string

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) {

推荐阅读