0

这是导致错误的代码:

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 上不存在但不是符号的属性是什么?

到目前为止,这些幽灵属性一直是“检查”和“构造函数”,但我之所以提出这个问题,是因为我需要找出可能还有哪些其他属性,以便我可以提前处理它们!

4

0 回答 0