#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:
Есть две проблемы:
-
Вероятно, эта строка выполняет не то, что вы думаете:
export default { sum, mul }
-
Вы смешиваете синтаксис собственного модуля (
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. Пожалуйста, найдите время, чтобы прочитать ответы, которые уже были опубликованы, прежде чем публиковать ответ, и не просто повторяйте то, что уже было рассмотрено в предыдущих ответах, это просто загромождает ситуацию.