const函数、重载和泛型typescript



Typescript支持函数重载,这很酷,并且可以使常量函数重载如下:

interface FetchOverload {
(action: string, method: 'post' | 'get'): object;
(action: string): object
}
const fetch: FetchOverload = (action: string, method: 'get' | 'post' = 'get'): object { ... }

但假设我想通知类型的预期响应,而不是任何object。我可以通过简单地用所需类型替换object来做到这一点:

interface FetchOverload {
(action: string, method: 'post' | 'get'): UserResponse;
(action: string): UserResponse
}
const fetch: FetchOverload = (action: string, method: 'get' | 'post' = 'get'): UserResponse { ... }

如果我想更进一步,而不是说它只能返回类型为UserResponse的响应,我可以返回一个泛型类型:

interface FetchOverload<T> {
(action: string, method: 'post' | 'get'): T;
(action: string): T
}
const fetch: FetchOverload<T> = (action: string, method: 'get' | 'post' = 'get'): T { ... }

问题是,对于const,不存在泛型类型T。事实上没有,我需要在某个地方声明T是一个泛型类型,但我不知道在哪里!

我到处都试过了,但无法让它理解有一种类型T:

<T> const fetch: ...
const <T> fetch: ...
const fetch <T>: ...
const fetch: <T> FetchOverload<T> = ...
const fetch: FetchOverload<T> = <T> (action: ...)

我找到的唯一解决方案是将const函数转换为具有重载的本机函数:

function fetch<T>(action: string, method: 'post' | 'get'): T;
function fetch<T>(action: string): T;
function fetch<T>(action: string, method: 'post' | 'get' = 'get'): T { ... }

所以我想知道的是,事实上我是否需要以这种方式使用它,或者是否还有一些解决方案可以继续使用const

I"发现的";答案,因为我最终在这个问题这一问题答案该答案

interface FetchOverload {
<T> (action: string, method: 'post' | 'get'): T;
<T> (action: string): T
}
export const fetch: FetchOverload = <T,> (action: string, method: 'get' | 'post' = 'get'): T { ... }

事实上,唯一奇怪的是类型后面有逗号,但这是强制性的,所以我没有太多事情要做。但一切都解决了!

相关内容

  • 没有找到相关文章

最新更新