TypeScript调用无返回值函数报TS2349错误如何解决
错误原因
TS2349报错的核心原因是类型不匹配:你定义的it辅助函数没有返回值(返回类型为void),但在dummytests.ts中你将it()的执行结果赋值给了导出变量check_if15_eqls_15,导致这个变量的实际类型是void,后续在测试入口中把void类型值当作函数调用,自然会触发「void类型不存在调用签名」的错误。
从逻辑上看,你当前实现的it函数在被调用时就会直接执行传入的校验逻辑、打印测试结果,本身不需要额外二次调用。
修复方案
两种改法可以根据自己的测试框架设计需求选择:
方案1:批量导出测试执行入口(适配当前it的执行逻辑)
保留现有it函数的实现,把单测文件里的测试用例统一放到导出的执行函数中,避免提前执行it、也不需要导出void类型的变量:
- 修改
dummytests.ts:// File: dummytests.ts import { strict as assert } from 'node:assert'; import { it } from "src/spec/helper"; // 导出统一的测试执行函数,调用时才会跑所有用例 export const runDummyTests = () => { it("should check if something is true", () => { assert.strictEqual(15, 15); }); // 后续新增测试用例,直接在函数内追加it()调用即可 } - 修改
testRunner.ts,调用统一的测试执行函数:// File: testRunner.ts import { runDummyTests } from 'src/spec/frontend/dummytests'; console.log("This test harness is for the frontend tests.\n"); runDummyTests();
方案2:改造it函数返回可执行的单测函数
如果你需要把单个测试用例作为独立函数导出、支持单独调用,可以修改it的实现,让它返回包装后的测试执行函数,而不是直接在it内部跑测试逻辑:
修改helper.ts:
//File: helper.ts type validator = () => void; export const it = (desc: string, fn: validator) => { // 返回可调用的测试函数,调用时才执行校验、打印结果 return () => { try { fn(); console.log("\x1b[32m%s\x1b[0m", `\u2714 ${desc}`); } catch (error) { console.log("\n"); console.log("\x1b[31m%s\x1b[0m", `\u2718 ${desc}`); console.error(error); } } };
这种改法下你原来的dummytests.ts逻辑不需要调整,check_if15_eqls_15会接收到it返回的函数类型值,在入口调用时不会再触发类型错误。
额外注意事项
- 文件名大小写不一致:你定义的测试用例文件名为
dummytests.ts,但导入路径写的是dummyTests,在大小写敏感的操作系统(如Linux)上会直接报模块找不到错误,需要统一文件名和导入路径的大小写。 - 拼写错误:测试描述里的
shoulld多输入了一个字母l,正确拼写为should。
内容的提问来源于stack exchange,提问作者Rishav Sharan
相关产品推荐
相关产品推荐

