如何使用打字稿来监听对象更改?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用打字稿来监听对象更改?相关的知识,希望对你有一定的参考价值。
我有一个对象,我想听取更改以执行某些操作,在ES6中,我会做类似的事情:
let members = {};
let targetProxy = new Proxy(members, {
set: function (members, key, value) {
console.log(key + " set to " + value);
members[key] = value;
return true;
}
});
在打字稿中转换
const members = {};
let targetProxy: any = new Proxy(members, {
set: function (members: any, key: string, value: string) {
console.log(`${key} set to ${value}`);
members[key] = value;
return true;
}
});
但是linter向我显示了这个错误信息
[ts] Cannot find name 'Proxy'.
终端输出:
我做了一些研究,我无法找到错误。
正如所建议的那样,我将模块参数更改为ES6而不是commonjs,没有任何反应。完整输出如下
和我的package.json
{
"compilerOptions": {
"module": "ES6",
"moduleResolution": "node",
"noImplicitAny": true,
"sourceMap": true,
"outDir": "dist",
"baseUrl": ".",
"paths": {
"*": ["node_modules/*"]
}
},
"include": [
"src/**/*"
]
}
答案
您的项目需要将TypeScript编译器选项设置为目标ES2015或更高版本(docs)。命令行选项将是--target "ES2015"
(或"ES2016"
等,或"ESNext"
以定位最新提议的功能)。
旁注:set
以正常方式捕获设置属性值,但不是通过Object.defineProperty
执行此操作:
const members = {};
let targetProxy = new Proxy(members, {
set: function(members, key, value) {
console.log(`${key} set to ${value}`);
members[key] = value;
return true;
}
});
console.log("---- Notice no set trap fired:");
console.log(`targetProxy.foo: ${targetProxy.foo}`);
Object.defineProperty(targetProxy, "foo", {
value: 1,
writable: true,
configurable: true,
enumerable: true
});
console.log(`targetProxy.foo: ${targetProxy.foo}`);
Object.defineProperty(targetProxy, "foo", {
value: 2,
writable: true,
configurable: true,
enumerable: true
});
console.log(`targetProxy.foo: ${targetProxy.foo}`);
console.log("---- But it's fired for simple assignment:");
console.log(`targetProxy.bar: ${targetProxy.bar}`);
targetProxy.bar = 1;
console.log(`targetProxy.bar: ${targetProxy.bar}`);
targetProxy.bar = 2;
console.log(`targetProxy.bar: ${targetProxy.bar}`);
.as-console-wrapper {
max-height: 100% !important;
}
以上是关于如何使用打字稿来监听对象更改?的主要内容,如果未能解决你的问题,请参考以下文章