首页 > 解决方案 > 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抱怨。我也可以将所有属性定义为可选的,但从概念上讲我不喜欢这样。

我觉得映射类型可以完成这项工作,但我可能没有正确的方法。

谢谢你的帮助!

标签: typescripttesting

解决方案


我可以在我的映射类型定义中将所有属性设为可选:

type Mockify<T> = {
    [P in keyof T]?: jest.Mock<{}>
};

这相当于Partial我每次使用Mockify.

然后,当稍后使用我的模拟对象时,类型断言将其转换回原始界面,每个人都很高兴

const mockFoo: Mockify<IFoo> = {
    otherFunc: {
        // Mocked function behavior
    }
} 

dependentFunc(mockFoo as IFoo);

推荐阅读