TypeScript中Mock fs/promises.readdir如何指定要使用的函数重载签名
解决方案
原代码报错的核心原因是:你写的
callsFake回调没有明确入参,TypeScript无法通过入参匹配重载,就会默认使用readdir最后一个重载的返回类型做校验,所以才会要求你返回Dirent[]。
你可以通过以下两种合规的方式指定匹配返回Promise<string[]>的重载:
方法1:明确标注fake函数的入参类型(最推荐)
TypeScript的重载匹配逻辑是优先匹配入参签名吻合的重载,你只要给callsFake的回调函数标注和目标重载一致的入参,就能自动匹配到对应返回值的重载:
import * as fsPromisesModule from "fs/promises"; import type { PathLike } from "fs"; // 入参签名和返回string[]的readdir重载完全匹配 stub(fsPromisesModule, "readdir").callsFake(async (path: PathLike): Promise<string[]> => { return ['/test/file/path']; });
如果你的业务代码调用readdir时传了编码参数(比如readdir(path, 'utf-8')),调整入参标注即可匹配对应重载:
stub(fsPromisesModule, "readdir").callsFake(async (path: PathLike, encoding: BufferEncoding): Promise<string[]> => { return ['/test/file/path']; });
方法2:给stub指定泛型约束
如果你使用的是Sinon的stub工具,可以直接通过泛型明确指定stub的调用签名,跳过重载匹配逻辑:
import * as fsPromisesModule from "fs/promises"; import type { Stub } from "sinon"; // 泛型依次指定:入参类型、返回值类型 (stub(fsPromisesModule, "readdir") as Stub<Parameters<typeof fsPromisesModule.readdir>, Promise<string[]>>) .callsFake(async () => ['/test/file/path']);
临时绕过方案(不推荐)
如果只是想快速跳过类型校验,可以使用any类型断言,但是会丢失后续的类型检查能力:
stub(fsPromisesModule, "readdir").callsFake(async () => ['/test/file/path'] as any);
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

