首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在打字本中重写window.function?

如何在打字本中重写window.function?
EN

Stack Overflow用户
提问于 2020-01-07 02:26:06
回答 1查看 1.5K关注 0票数 0

当方法被自动调用时,我正在尝试记录。(我从https://stackoverflow.com/a/5034657/11188822获得了编码)

代码语言:javascript
复制
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);
            }
        }
    }

然后叫这个。

代码语言:javascript
复制
this.augment(function(name, fn) {
        console.log('calling ' + name);
    });

我犯了个错误

错误在src/app/app.component.ts(81,17):ERROR TS2740: type '() => any‘类型’=>any‘中缺少以下属性: Blob、TextDecoder、TextEncoder、URL和232更多。

如何覆盖窗口函数?

EN

回答 1

Stack Overflow用户

发布于 2020-01-07 04:28:18

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

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

代码语言:javascript
复制
interface Window extends EventTarget, WindowTimers, ... {
  ...
  [index: number]: Window;
}

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

您可以扩展现有的Window接口来告诉它您的情况:

代码语言:javascript
复制
declare global {
  interface Window {
    [index: string]: () => any; // or just any
  }
}

此外,您还必须显式地声明变量let namestring类型。

代码语言:javascript
复制
let name: string

下面是完整的代码:

app.component.ts

代码语言:javascript
复制
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抱怨:

抑制错误:

代码语言:javascript
复制
// @ts-ignore
window[name] = (function(n, f) {

使用any关键字:

代码语言:javascript
复制
(window[name] as any) = (function(n, f) {

代码语言:javascript
复制
(<any>window[name]) = (function (n, f) {
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59621409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档