有没有办法对两个typescript模块的方法进行类型比较?

ewm0tg9j  于 2022-11-30  发布在  TypeScript
关注(0)|答案(2)|浏览(130)

实施例:
api.ts

export const getStuffs = async (term:string): Promise<Stuff[]> => {
   const stuffs = await getStuffsFromDB(term);
   return stuffs;
}

mock_api.ts

export const getStuffs = async (term:string): Promise<Stuff[]> => {
   const stuffs = [
     { ... hardcoded stuff }
   ];
   return stuffs;
}

是否有方法添加CI/CD测试,以比较上面提供的两个示例模块在类型输入/输出方面是否相同:(term:string):Promise<stuff[]>
目的是自动提醒开发人员始终复制api.ts中导出的方法,以便在mock_api.ts中进行模拟

cdmah0mi

cdmah0mi1#

使用IfEqualsBeTrue这两个泛型辅助类型,我们可以在编译时检查两个类型是否相等。

type IfEquals<T, U> =
  (<G>() => G extends T ? 1 : 2) extends
  (<G>() => G extends U ? 1 : 2) ? true : false;

type BeTrue<T extends true> = T

将这两个函数导入到一个文件中,但要确保两个函数都为其中一个函数提供别名,以避免命名冲突。
现在可以检查两个函数类型是否相等。

declare let res: BeTrue<IfEquals<typeof getStuffs, typeof getStuffs2>>

如果类型不相等,此行将发出编译时错误。
Playground

8i9zcol2

8i9zcol22#

目的是自动提醒开发人员始终复制api.ts中导出的方法,以便在mock_api.ts中进行模拟
实际上并不需要CI/CD来检查这一点,相反,您可以简单地创建一个定义所需方法的接口:

interface ApiMethods {
    getStuffs: (term: string) => Promise<any[]>
}

然后在实现此接口的每个文件中创建一个对象:

const apiMethods: ApiMethods = {
    getStuffs: async () => {
        return new Promise((resolve, reject) => {resolve([])});
    }
}

const mockMethods: ApiMethods = {
    getStuffs: async () => {
        return new Promise((resolve, reject) => {resolve([])});
    }
}

ApiMethods添加新方法/属性将强制您在apiMethodsmockMethods中实现这些方法/属性。

相关问题