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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:06:03