Экспортированная функция ES5 не распознана

#javascript #ecmascript-5

#javascript #ecmascript-5

Вопрос:

Я получил это math.js:

 const sum = (a, b) => a   b
const mul = (a, b) => a * b

export default { sum, mul }
  

затем в math.test.js:

 const { sum, mul } = require('./math')

test('Adding 1   1 equals 2', () => {
  expect(sum(1, 1)).toBe(2)
})

test('Multiplying 1 * 1 equals 1', () => {
  expect(mul(1, 1)).toBe(1)
})
  

Я получил эту ошибку от jest:

 ? Adding 1   1 equals 2

  TypeError: sum is not a function

    5 | })
    6 | test('Adding 1   1 equals 2', () => {
  > 7 |   expect(sum(1, 1)).toBe(2)
    8 | })
    9 |
  

Если я импортирую эти функции в тестовый файл, jest работает нормально.
Не могу понять, как правильно использовать внешнюю функцию в ES5.

Комментарии:

1. Ваше смешивание загружает ваш модуль,. require это commonjs, попробуйте вместо этого использовать import.

2. В ES5 нет модулей. Они были представлены в ES2015 (иногда называемые «ES6»).

3. Кстати, то же самое было с функциями arrow, это еще одна вещь, несовместимая с ES5.

4. извините, ребята, я воспользовался онлайн-руководством …. в любом случае, спасибо, я уловил проблему!

Ответ №1:

Есть две проблемы:

  1. Вероятно, эта строка выполняет не то, что вы думаете:

     export default { sum, mul }
      
  2. Вы смешиваете синтаксис собственного модуля ( export / import , часто называемый «ESM» для ECMAскриптованными M файлами) с синтаксисом CommonJS ( require ). Используйте import для импорта в синтаксисе ESM.

export default { sum, mul } экспортирует экспорт по умолчанию, который представляет собой объект со свойствами sum и mul (что было бы странно делать с ESM). Если это действительно то, что вы хотите сделать, прекрасно, но обычно это не лучшая практика. Вы не можете выполнить деструкцию при импорте, но вы можете разрушить объект после его импорта:

 // BUT YOU PROBABLY DON'T WANT TO DO THIS, KEEP READING
import math from "./math"; // Imports that default export
cosnt {sum, mul} = math;   // Destructures it into constants
  

Но обычно вы бы использовали именованный экспорт, либо по ходу работы:

 export const sum = (a, b) => a   b
export const mul = (a, b) => a * b
  

…или все сразу (стилевое решение):

 const sum = (a, b) => a   b
const mul = (a, b) => a * b

export { sum, mul };
  

Чтобы импортировать именованные экспортные данные, вы должны использовать синтаксис, подобный вашему, но с import , не require :

 import { sum, mul } from "./math";
  

Это не деструктурирование, хотя и выглядит похоже. В ней отсутствуют некоторые функции деструктурирования (вложенность, значения по умолчанию, …).

В качестве альтернативы вы можете импортировать объект пространства имен:

 import * as math from "./math";
  

У нее будут свойства sum и mul (вот почему вы обычно не экспортируете объект с помощью встроенных модулей JavaScript; все, что действительно хочет, может получить объект пространства имен).

Ответ №2:

использовать named export :

 export const sum = (a, b) => a   b
export const mul = (a, b) => a * b
  

или

 export {sum,mul}
  

затем

 import { sum, mul } from './math'
  

Ответ №3:

Заменить

 const { sum, mul } = require('./math')
  

с

 import { sum, mul } from './math'
  

Комментарии:

1. require это не единственная проблема здесь.

Ответ №4:

Вы можете оставить объявления своих функций как есть и изменить свой экспорт на export { add, mul } и, как было сказано выше, измените свой require оператор на import .

Комментарии:

1. Пожалуйста, найдите время, чтобы прочитать ответы, которые уже были опубликованы, прежде чем публиковать ответ, и не просто повторяйте то, что уже было рассмотрено в предыдущих ответах, это просто загромождает ситуацию.