2016-10-01 2 views
3

Я использую ES6 + babel с плагином ["iife-wrap"].Получить тип значения в ES6

Я пытаюсь переделать плагин, который я создаю раньше (форма-валидация). Я пытаюсь проверить, являются ли данные объектом.

Для ES5 это просто: typeof blah === 'object' или string, function, and etc.

Однако, если я положил его на ES6. Это приведет к ошибке . Некопаемое TypeError: _typeof не является функцией

Вот образец моего кода.

let es6function =() => { 
    return 'asd'; 
} 

console.log(typeof es6function) 

class Person { 

} 

let tryThis = new Person() 
console.log(tryThis instanceof Person) 

ES5: Сообщение скомпилированные

; 

(function() { 
    'use strict'; 

    function _classCallCheck(instance, Constructor) { 
     if (!(instance instanceof Constructor)) { 
      throw new TypeError("Cannot call a class as a function"); 
     } 
    } 

    var _typeof = typeof Symbol === "function" && _typeof(Symbol.iterator) === "symbol" ? function (obj) { 
     return typeof obj === 'undefined' ? 'undefined' : _typeof(obj); 
    } : function (obj) { 
     return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof(obj); 
    }; 

    var es6function = function es6function() { 
     return 'asd'; 
    }; 

    console.log(typeof es6function === 'undefined' ? 'undefined' : _typeof(es6function)); 

    var Person = function Person() { 
     _classCallCheck(this, Person); 
    }; 

    var tryThis = new Person(); 
    console.log(tryThis instanceof Person); 
})(); 

Любая помощь будет оценена. Благодарю.

+0

Это почти определенно связано с вашим транспилером (babel). Он работает как ожидается в браузере, который поддерживает ES6 изначально. – rvighne

+0

Кажется, что работает отлично для меня, ошибка говорит '_typeof', вы уверены, что у вас нет опечатки – adeneo

+0

Я имею в виду переписанную. Подожди, я отредактирую. –

ответ

2

Похоже, вы случайно запустили Babel в два прохода над вашим кодом.

ES6 код

console.log(typeof es6function) 

действительно становится transpiled к

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; 

console.log(typeof es6function === 'undefined' ? 'undefined' : _typeof(es6function)); 

который не стал

var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; 

var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { 
    return typeof obj === "undefined" ? "undefined" : _typeof2(obj); 
} : function (obj) { 
    return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj); 
}; 

console.log(typeof es6function === 'undefined' ? 'undefined' : _typeof(es6function)); 

когда вы transpile его снова. Помимо дублирования _typeof/_typeof2 это очень похоже на результат вашей транспиляции. Проверьте конфигурацию сборки и плагины babel. Попробуйте отключить один за другим, чтобы увидеть, когда проблема исчезнет, ​​и сообщите об ошибке с ответственным компонентом.

-3

Можно ли скопировать круглые скобки таким образом?

if(typeof(Symbol) === 'function')) { ... } 
+5

И зачем это делать OP? 'typeof' - оператор. Скобки не нужны. 'typeof foo' такой же, как' typeof (foo) 'такой же, как' typeof ((((((foo)))))) '. –

+0

Действительно оба пути должны работать, но я думаю, что причиной может быть компилятор –

+0

Ну, он работает в https://babeljs.io/repl/. –

Смежные вопросы