使用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
相关产品推荐
相关产品推荐

