typescript - Typescript - 具有映射类型的模拟接口
问题描述
出于测试目的,我希望能够创建一个实现接口的对象,仅具有我测试所需的功能,而不必手动维护具有所有可能属性的模拟对象。一般来说,我一次使用一个函数,所以不需要定义所有其他函数,但我不希望 TS 一直抱怨缺少属性。
例如,我有一个界面IFoo
:
interface IFoo {
myFunc(): string;
otherFunc(): number;
}
我试图创建一个映射类型,它分配jest.Mock<{}>
给IFoo
type Mockify<T> = {
[P in keyof T]: jest.Mock<{}>
};
像这样称呼它:
const mockFoo: Mockify<IFoo> = {
otherFunc: {
// Mocked function behavior
}
}
这种方法的问题是 TS 抱怨myFunc
传递给 Mockify 的对象缺少属性。
我也尝试Mockify<Partial<IFoo>>
忽略缺少的属性,但是我的类型定义IFoo
与其他一些函数不同,并且依赖于IFoo
抱怨。我也可以将所有属性定义为可选的,但从概念上讲我不喜欢这样。
我觉得映射类型可以完成这项工作,但我可能没有正确的方法。
谢谢你的帮助!
解决方案
我可以在我的映射类型定义中将所有属性设为可选:
type Mockify<T> = {
[P in keyof T]?: jest.Mock<{}>
};
这相当于Partial
我每次使用Mockify
.
然后,当稍后使用我的模拟对象时,类型断言将其转换回原始界面,每个人都很高兴
const mockFoo: Mockify<IFoo> = {
otherFunc: {
// Mocked function behavior
}
}
dependentFunc(mockFoo as IFoo);
推荐阅读
- elasticsearch - 如何在 kafka-connect 融合平台的 elasticsearch sink 连接器配置中使用 ca cert?
- apache-spark - 编写数据帧时从 Spark 到数据库的连接有多少?
- python - 用户输入问题
- visual-studio-code - 在VScode中,如何在launch.json中添加带有$的参数
- pyodbc - 如何使用 pyodbc 接口连接计算表
- vue.js - 带有 Vue 的 Apache ECharts 不显示工具提示
- html - 我的 CSS 无法识别滚动捕捉命令
- python - 带有条件的列表列表
- amazon-web-services - 允许基于 EC2 角色的 S3 存储桶操作
- msal - 是否可以只保护特定的 API 路由?