You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ts-jest测试Luxon DateTime扩展方法时出现函数未定义错误

解决Luxon DateTime扩展方法在ts-jest中报错TypeError: testDate.quarterStart is not a function的问题

以下是导致报错的几个核心问题及对应解决方案:

1. 类型声明与实际方法名不匹配

你的扩展代码中,接口声明的方法是myFunction,但实际给DateTime.prototype挂载的是quarterStart,类型系统无法关联两者,同时也会导致TypeScript的类型提示失效。

修正后的扩展代码:

import { DateTime } from "luxon";

// 修正模块声明路径和方法名
declare module "luxon" {
  export interface DateTime {
    quarterStart(month: number): DateTime; // 与实际挂载方法名保持一致
  }
}

DateTime.prototype.quarterStart = function (month: number): DateTime {
  // 修复year变量未定义问题,从当前实例获取年份
  const year = this.year;
  const result = DateTime.fromObject({
    day: 1,
    month: month,
    year: year,
  });

  return result;
};

2. 模块声明路径错误

原代码中声明的模块是"luxon/src/datetime",但正确的Luxon模块扩展应针对顶层的"luxon"模块,这样TypeScript才能正确识别对DateTime接口的扩展。

3. 测试代码未导入扩展文件

Jest运行测试时不会自动加载你的扩展代码,必须在测试文件中显式导入扩展模块,否则DateTime原型上不会存在quarterStart方法。

修正后的测试代码:

import { DateTime } from "luxon";
import "./path/to/your/extension-file"; // 替换为你的扩展文件实际路径

describe("DateTime extensions", () => {
  it.each<number>([1,2,3,4])("call quarterStart function", (month) => {
    const testDate = DateTime.fromObject({ year: 2023, month: 5, day: 1 });

    const start = DateTime.fromObject({ year: 2023, month: month, day: 1 });
    const expected = testDate.quarterStart(month);
    // 注意:Luxon实例不能用toBe比较引用,需用equals方法判断时间是否相等
    expect(expected.equals(start)).toBe(true);
  });
});

额外注意:实例比较逻辑错误

原测试中使用expect(start).toBe(expected)是错误的,toBe比较的是对象引用,两个独立创建的DateTime实例引用必然不同,需使用Luxon自带的equals方法或toEqual来验证时间一致性。

内容的提问来源于stack exchange,提问作者Luiso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:56:07