【发布时间】:2018-03-01 20:30:26
【问题描述】:
我正在写一些中间件,界面如下
interface Config {
callApi<P> (api: ApiClient): Promise<P>,
transformResponse?(payload: P): any
}
从上面可以看出,配置采用callApi 函数,该函数将调用远程API 并返回基于promise 的结果,然后可选的transformResponse 将接收有效负载并应用转换给它。关键部分是transformResponse 函数应该根据callApi 调用的返回类型推断负载的类型
问题是上面是无效的,因为P里面的transformResponse类型不能达到callApi函数的同一个变量。
有没有什么办法可以完成上面的,而不必像这样传入API响应类型
interface Config<ApiResponse> {
callApi (api: ApiClient): Promise<ApiResponse>,
transformResponse?(payload: ApiResponse): any
}
示例用法
const callCreateComment: Config = {
callApi (api) => api.createComment(),
transformResponse(payload) => ({ ...payload // infer the return type of the `api.createComment()` call })
}
【问题讨论】:
-
这感觉就像你在要求existential types,但我不确定。您能否说明您将如何使用它以及您希望如何阻止使用它?显然,您可以只返回
Promise<any>并使用payload: any,但我猜您正在尝试执行某些操作。你真的是说Config<Result>的callApi()函数允许调用者 指定P?还是callApi()会返回一些未知的调用者P必须由transformResponse在同一个对象上接受? -
我删除了 Result 类型以清理示例。重点是我希望能够在
transformResponse函数中推断/自动完成 API 调用的返回类型,而无需手动指定其返回类型
标签: typescript