这是导致错误的代码:
console.log(objectWithProxyProperty);
我正在处理的错误是,
TypeError: Cannot read property 'apply' of undefined
或者
Error: The assertion library used does not have a 'inspect' property or method.
取决于我使用的检查,这在下面的代码中进行了演示。很明显,“inspect”属性被发送到 get 方法,但“inspect”不是符号,并且“inspect”也无法读取prop in chaiAssert
。
objectWithProxyProperty 看起来像:
const objectWithProxyProperty = {};
const assrt = <Partial<AssertStatic>> function () {
try {
return chaiAssert.apply(chaiAssert, arguments);
}
catch (e) {
return handleError(e);
}
};
// the assert property on objectWithProxyProperty is a Proxy
objectWithProxyProperty.assert = new Proxy(assrt, {
get: function (target, prop) {
if (typeof prop === 'symbol') {
return Reflect.get(...arguments);
}
if (!(prop in chaiAssert)) {
return handleError(
// new Error(`The assertion library used does not have property or method.`)
new Error(`The assertion library used does not have a '${prop}' property or method.`)
);
}
return function () {
try {
return chaiAssert[prop].apply(chaiAssert, arguments);
}
catch (e) {
return handleError(e);
}
}
}
});
似乎正在发生的事情是,当我使用名为“assert”的代理属性记录此对象时,代理本身会接收到 get 方法的奇怪属性。
具体来说,这些属性称为“检查”和“构造函数”,它们似乎不是符号。
所以我必须“解决问题”是添加一个这样的检查:
const objectWithProxyProperty = {};
const assrt = <Partial<AssertStatic>> function () {
try {
return chaiAssert.apply(chaiAssert, arguments);
}
catch (e) {
return handleError(e);
}
};
let badProps = {
inspect: true,
constructor: true
};
objectWithProxyProperty.assert = new Proxy(assrt, {
get: function (target, prop) {
if (typeof prop === 'symbol') {
return Reflect.get(...arguments);
}
if (badProps[String(prop)]) { // ! added this !
return Reflect.get(...arguments);
}
if (!(prop in chaiAssert)) {
return handleError(
// new Error(`The assertion library used does not have property or method.`)
new Error(`The assertion library used does not have a '${prop}' property or method.`)
);
}
return function () {
try {
return chaiAssert[prop].apply(chaiAssert, arguments);
}
catch (e) {
return handleError(e);
}
}
}
});
这些在 chaiAssert 上不存在但不是符号的属性是什么?
到目前为止,这些幽灵属性一直是“检查”和“构造函数”,但我之所以提出这个问题,是因为我需要找出可能还有哪些其他属性,以便我可以提前处理它们!