TypeScript中fs.writeFile传入callback报类型不兼容错误如何解决
TypeScript下fs.writeFile回调类型不匹配报错解决
报错场景
开发API接口写入文件时,项目构建阶段抛出类型错误,相关业务代码如下:
server.get('/deleteall', async (request, reply) => { var json = JSON.stringify(deleteall); fs.writeFile('todos.json', json, 'utf8', callback); return 'File overwritten.' })
构建阶段抛出的报错信息:
Argument of type '(arg0: string, json: string, arg2: string, callback: any) => void' is not assignable to parameter of type 'NoParamCallback'.
报错根因
这是TypeScript静态类型校验抛出的参数类型不匹配错误,核心问题分为两层:
- 类型层面:Node.js内置
fs.writeFile方法要求最后一个传入的回调参数为NoParamCallback类型,也就是仅接收1个错误对象入参的函数,类型定义为(err: NodeJS.ErrnoException | null) => void,你代码中传入的callback被TS识别为需要4个入参的函数,完全不符合参数类型要求。 - 逻辑层面:代码本身存在两个运行时隐患:一是没有定义
callback变量,代码运行到这一行会直接触发未定义变量错误;二是你使用了async路由处理函数,但回调风格的fs.writeFile不会被await等待,会出现接口已经返回响应、文件还没完成写入的时序问题。
修复方法
推荐方案:使用Promise版本fs API适配async逻辑
直接用Node.js自带的Promise风格fs接口,不需要手写回调,配合await等待写入完成,逻辑清晰也不会出现类型匹配问题:
server.get('/deleteall', async (request, reply) => { const json = JSON.stringify(deleteall); await fs.promises.writeFile('todos.json', json, 'utf8'); return 'File overwritten.' })
备选方案:传入符合类型要求的回调函数
如果要保留回调写法,直接在参数位置写入符合类型要求的回调即可,注意此时路由处理函数不要加async关键字,避免响应时序问题:
server.get('/deleteall', (request, reply) => { const json = JSON.stringify(deleteall); fs.writeFile('todos.json', json, 'utf8', (err) => { if (err) { reply.status(500).send('File write failed'); return; } reply.send('File overwritten.'); }); })
内容的提问来源于stack exchange,提问作者Zariaa_
相关产品推荐
相关产品推荐

