typescript - 如何在 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 更多.
如何覆盖窗口功能?
解决方案
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) {
推荐阅读
- javascript - 更新数组项目顺序而不移动它
- python - request.GET.get(),它在 django 中是如何工作的?
- r - write.fasta 函数指定要在循环中写入的目录
- java - 向自定义权限评估器添加其他方法?
- raspberry-pi - 使树莓派上的 MariaDB 10.3 使用 OpenSSL 而不是 yaSSL
- java - 从 Spring Rest Controller 调用 Servlet 并从 Servlet 返回图像
- java - 如何将背景图像添加到导航抽屉中的项目
- c++ - cmake:如何将依赖静态库的所有符号添加到正在构建的静态库中
- kubernetes - NetworkPolicy:允许除特定端口之外的所有端口
- javascript - 迁移到最新的 Angular 版本后,无法解析“fs”和字段“浏览器”不包含有效的别名配置错误