如何在TypeScript中用映射类型为Map<>定义类型替换Function类型修复ESLint报错
第一步:定义枚举与函数类型的映射关系
首先建立枚举值到对应函数类型的映射表,完全匹配你定义的三个函数类型:
type ApiFunctionMap = { [ApiEnum.CREATE_NAME]: CreateName [ApiEnum.CREATE_COMPANY]: CreateCompany [ApiEnum.UPDATE_NAME]: UpdateName }
第二步:修正Map的类型定义
把原来的Function类型替换为映射表的所有函数类型的联合类型,同时不需要再用as Function做类型断言,即可解决ESLint报错:
const api: Map<ApiEnum, ApiFunctionMap[keyof ApiFunctionMap]> = new Map([ [ApiEnum.CREATE_NAME, createName], [ApiEnum.CREATE_COMPANY, createCompany], [ApiEnum.UPDATE_NAME, updateName], ]);
(可选)实现调用时的类型安全
如果想要调用api的时候自动推导参数和返回值类型,避免调用出错,可以额外封装一个通用调用方法:
function callApi<T extends ApiEnum>( apiName: T, variables: Parameters<ApiFunctionMap[T]>[0] ): ReturnType<ApiFunctionMap[T]> { const fn = api.get(apiName) as ApiFunctionMap[T]; return fn(variables); }
调用示例:
// 自动提示参数需要是number类型,返回值类型为Promise<{data: number}> const res = callApi(ApiEnum.CREATE_NAME, 123);
额外注意
你当前定义的函数类型标注了返回Promise,但实际函数实现是同步返回对象,两者不匹配,按需二选一修正即可:
- 把函数改为
async函数,自动包裹Promise - 去掉函数类型定义里的
Promise<>包裹层
内容的提问来源于stack exchange,提问作者jacobcan118
相关产品推荐
相关产品推荐

