为什么 require() 不能为我导出到 node.js 模块的常量工作?

Why isn't require() working for my constants exported into a node.js modules?

我正在尝试 运行 这个 Jest 测试:

test("find the earliest start", () => {
  expect(findEarliestStart([ex.TS2])).toBe(ex.TS2.start_time);
  expect(findEarliestStart([ex.TS5, ex.TS2, ex.TS6])).toBe(ex.TS5.start_time);
});

我在测试文件中有这个要求: const ex = require("constants");

我收到 TS2 未定义的错误,特别是“类型错误:无法读取未定义的 属性 'start_time'”。

在constants.ts我有:

const TS2: Timeslot = 
{start_time: 940,
  end_time: 980,
  day: "Wed",
  term: "2"
}

const TS5: Timeslot = 
{start_time: 180,
  end_time: 210,
  day: "Wed",
  term: "2"
}

const TS6: Timeslot = 
{start_time: 250,
  end_time: 310,
  day: "Wed",
  term: "2"
}

module.exports = {
  TS2:TS2, TS5:TS5, TS6:TS6
}

函数 findEarliestStart 如下所示:

/**
 * return the earliest start time out of all timeslots
 * @param {Timeslot[]} lots 
 */
export const findEarliestStart = (lots:Timeslot[]): Time => {
  if(!lots.length){
    throw new Error("cannot find earliest start of empty array");
  };
  return lots.reduce((min:number, ts:Timeslot) => {
    return (ts.start_time < min) ? ts.start_time : min
  },
  Number.MAX_VALUE)

首先,您好,欢迎来到 Whosebug,@ptellier!

TL;DR: 使用const ex = require("./constants");,在常量前面加上“./”。

节点中的require有一些语法需要注意。通常,它用于 require 来自外部包的组件和模块,使用包管理器安装。在这种情况下,相应包的名称作为参数提供。如果包是命名空间的一部分,它以 @namespace/packagename 开头,否则它只是 packagename.

要加载本地文件,你必须告诉节点你正在寻找一个本地文件而不是一个包。您可以通过使用相对路径前缀来完成此操作,例如 ./ 用于与当前文件位于同一目录中的文件,或使用 ../ 从当前文件夹的父目录开始。

由于缺少路径前缀,节点加载了其内部 constants 模块,该模块显然没有 TS* 属性,这就是为什么它们是 undefined.