如何在CI/CD中测试TypeScript模块方法的类型一致性?
如何在CI/CD中验证TypeScript模块导出方法的类型一致性?
问题说明
现有两个TypeScript模块: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 = [ { /* 硬编码数据 */ } ]; return stuffs; }
需要在CI/CD流程中添加测试,验证两个模块导出的getStuffs方法输入输出类型是否一致,目的是自动提醒开发者同步两个模块里的导出方法。
可行实现方案
完全可以做到,以下是几种简单直接的方式:
1. 抽公共类型强制对齐
先创建一个类型定义文件api-types.ts,把getStuffs的函数类型抽出来复用:
export type GetStuffsFn = (term: string) => Promise<Stuff[]>;
然后在api.ts和mock_api.ts里用这个类型约束导出的函数:
// api.ts import type { GetStuffsFn } from './api-types'; export const getStuffs: GetStuffsFn = async (term) => { const stuffs = await getStuffsFromDB(term); return stuffs; };
// mock_api.ts import type { GetStuffsFn } from './api-types'; export const getStuffs: GetStuffsFn = async (term) => { const stuffs = [ { /* 硬编码数据 */ } ]; return stuffs; };
只要其中一个函数的签名和GetStuffsFn不匹配,TypeScript编译就会报错。CI/CD里只要执行tsc --noEmit就能检测出问题,直接阻断流程并提示开发者修正。
2. 写类型断言测试文件
如果不想抽公共类型,也可以写个简单的测试文件api-mock-type-check.test.ts,用TypeScript的类型断言来验证:
import type { getStuffs as RealGetStuffs } from './api'; import { getStuffs as MockGetStuffs } from './mock_api'; // 断言mock函数类型和真实函数完全一致,不一致则编译报错 const _check: typeof RealGetStuffs = MockGetStuffs;
这个文件不需要运行,只要执行TypeScript编译就能检查类型匹配情况。如果类型不一致,tsc会直接抛出错误,CI/CD中加入这个编译步骤就行。
3. 集成到CI/CD流程
不管用哪种方式,只要在CI/CD的执行脚本里加入TypeScript编译命令:
tsc --noEmit
如果类型不匹配,命令会返回非零退出码,CI/CD流程就会失败,自动提醒开发者同步两个模块的方法签名。
内容的提问来源于stack exchange,提问作者Neil Molina
相关产品推荐
相关产品推荐

