typescript - 推断 API 命名空间对象的方法类型
问题描述
有两个名为user
和的 API 命名空间project
。我尝试创建一个可以推断 API 命名空间对象的方法类型的通用函数。
const user = {
async getUser(id: string): Promise<string> {
return 'user'
}
}
const project = {
async getProject(): Promise<string> {
return 'project'
}
}
const apis = {
user,
project
};
interface UseApiQueryResponse<Data> {
loading: boolean;
data: Data | undefined;
}
export function useApiQuery<Params, Data>(api: ??, params: Params): UseApiQueryResponse<Data> {
return api(params)
.then((res: string) => ({loading: false, data: res}));
}
客户端使用:
useApiQuery(apis.user.getUser, {id: '1'});
useApiQuery(apis.project.getProject);
我如何输入api
参数,它可以是任何 API 方法。最好Data
根据类型推断或约束返回值类型api
解决方案
首先,您需要推断 的第一个参数useApiQuery
:
type AsyncFn = (...args: any[]) => Promise<any>
const useApiQuery = <Api extends AsyncFn, Data>(api: Api, ...params: Parameters<Api>) =>
api(params)
.then((res: string) => ({ loading: false, data: res }))
因为,useApiQuery
返回承诺,你可以仅仅UseApiQueryResponse<Data>
因为它是一个返回Promise<UseApiQueryResponse<Data>>
:
此外,这行代码useApiQuery(apis.user.getUser, { id: '1' })
是无效的,因为getUser
需要 astring
而不是对象。
这是完整的示例:
const user = {
async getUser(id: string) {
return 'user'
}
}
const project = {
async getProject() {
return 42
}
}
const apis = {
user,
project
};
interface UseApiQueryResponse<Data> {
loading: boolean;
data: Data | undefined;
}
type AsyncFn = (...args: any[]) => Promise<any>
const useApiQuery = <Api extends AsyncFn>(api: Api, ...params: Parameters<Api>):
Promise<UseApiQueryResponse<ReturnType<Api>>> =>
api(params)
.then((res) => ({ loading: false, data: res }))
const result1 = await useApiQuery(apis.user.getUser, '42'); // UseApiQueryResponse<Promise<string>>
const result2 = await useApiQuery(apis.project.getProject); // UseApiQueryResponse<Promise<number>>
export { }
推荐阅读
- vba - VBA for Word - UNC 路径
- r - 按模式填充值
- vuex - 未捕获的类型错误:Vue 不是构造函数 - 带有 Vue 3 的 Vuex
- c# - 从派生类 C# 调用超基类方法
- javascript - Safari浏览器不要求麦克风许可
- python - 这是我尝试安装 pip3 时得到的结果
- animation - Anylogic,动画队列
- csv - arcgis 开发人员 - 将数据从 FeatureServer 导出到 csv 文件
- ruby - 当数组计数增加时,出现此错误“无法分配内存 (NoMemoryError) zlib(finalizer):流被过早释放”。
- .net-core - 更新数据库时出现此错误