Символ против строки при извлечении свойства из целевого объекта с использованием объекта ES6 Proxy

Используя следующий код:

 const assrt = function () {
    try {
      return chaiAssert.apply(null, arguments);
    }
    catch (e) {
      return handleError(e);
    }
  };

 v.assert = new Proxy(assrt, {
    get: function (target, prop) {

      if(typeof prop === 'symbol'){
        // I don't know what to do with symbols, so return
         return Reflect.get(...arguments);
      }

      // but here! we still get properties that don't exist
      if(!chaiAssert[prop]){
        return handleError(
          new Error(`The assertion library used does not have '${prop}' property or method.`)
        );
      }

      return function () {
        try {
          return chaiAssert[prop].apply(null, arguments);
        }
        catch (e) {
          return handleError(e);
        }
      }
    }
  });

ошибка, которую я получаю с этим кодом:

TypeError: невозможно преобразовать значение символа в строку

и это происходит в строке:

new Error(`The assertion library used does not have '${prop}' property or method.`));

Я использовал прокси раньше, и я никогда не видел, чтобы символы передавались в метод get прокси. Кто-нибудь знает, как обойти эту проблему?

Почему символы передаются функции получения прокси-сервера и как правильно с этим справиться?


person Alexander Mills    schedule 28.09.2017    source источник
comment
реквизит, который отправляется в функцию get, равен Symbol(util.inspect.custom), и думаю, что есть и другие, которые также отправляются.   -  person Alexander Mills    schedule 29.09.2017
comment
Я думаю, вам нужно отлаживать код. Не похоже, что символы нужно отфильтровывать с помощью if(typeof prop === 'symbol'){.   -  person Qwertiy    schedule 11.10.2017


Ответы (1)


Почему символы передаются функции получения прокси?

Мы не знаем, вы не показали никакого кода, который на самом деле использует прокси. Но доступ ко многим символам осуществляется с помощью встроенных методов, например. когда вы повторяете прокси, он использует метод Symbol.iterator.

и как мне правильно с этим справиться?

Вы не можете объединить символ со строкой, вам нужно явно указать это. Вы можете использовать либо prop.toString(), либо просто переключиться на основе typeof prop.

person Bergi    schedule 28.09.2017
comment
можете ли вы продемонстрировать, что вы имеете в виду, включив typeof prop - person Alexander Mills; 29.09.2017
comment
typeof prop == "symbol" ? "Symbol ["+prop.toString()+"]" : prop или что вы хотите делать с символами. Может быть, просто полностью проигнорируйте их в своем обработчике прокси и просто ответьте им по умолчанию Reflect.get. - person Bergi; 29.09.2017
comment
Да, я не знаю, что делать с символами, но мне нужно вернуть то, что они ищут, когда символы будут переданы ... можете ли вы показать, как использовать Reflect, как вы предлагаете? - person Alexander Mills; 29.09.2017
comment
выглядит так =› return Reflect.get(...arguments) - person Alexander Mills; 29.09.2017
comment
Я так запутался, почему свойство, не являющееся символом, будет передано методу get обработчика, а целевое свойство не будет существовать в цели. Я обновлю ОП. - person Alexander Mills; 29.09.2017
comment
В но здесь! мы по-прежнему получаем свойства, которых не существует, вы имеете в виду, что вы по-прежнему получаете исключение из попыток строкового преобразования символов или что вызывается handleError? В любом случае опубликуйте минимально воспроизводимый пример со всем кодом, который вы выполняете. - person Bergi; 29.09.2017
comment
Мне придется сообщить вам позже, если проблема снова появится, я, честно говоря, не знаю, что происходит. - person Alexander Mills; 29.09.2017