ES5导出的功能无法识别

时间:2019-04-01 13:41:13

标签: 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)
})

我从玩笑中得到了这个错误:

? 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 |

如果我将这些功能导入测试文件,则说明运行良好。 无法理解在ES5中采用外部功能的正确方法。

4 个答案:

答案 0 :(得分:3)

有两个问题:

  1. 此行可能不执行您认为的操作:

    export default { sum, mul }
    
  2. 您正在混合本机模块语法(export / import,通常称为 E CMA S cript的“ ESM” M 个指令)(具有CommonJS语法(require)。使用import导入ESM语法。

export default { sum, mul }导出默认的导出对象,该对象是具有属性summul的对象(对于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";

上面将具有summul属性(这就是为什么通常不导出带有JavaScript本机模块的对象;任何真正想要的对象都可以获取名称空间对象的原因)。 / p>

答案 1 :(得分: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'

答案 2 :(得分:0)

替换

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

使用

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

答案 3 :(得分:0)

您可以按原样保留函数声明,并将导出更改为export { add, mul } 并如上所述,将您的require语句更改为import