当前位置: 首页 > 知识库问答 >
问题:

常量函数、重载和泛型类型脚本

尉迟正平
2023-03-14

Typescript支持函数重载,这很酷,可以像这样重载一个常量函数:

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

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

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

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

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

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

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

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

问题是,对于< code>const,没有泛型类型< code>T。事实上没有,我需要在某处声明< code>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 { ... }

因此,我想知道的是,实际上我是否需要这样使用它,或者是否仍然有一些继续使用< code>const的解决方案。

共有1个答案

束雅达
2023-03-14

我“发现”了答案,因为我最终在这个问题,这个问题,这个答案和这个答案中遇到了一个非常相似的问题。基本上我会做:

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 { ... }

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

 类似资料:
  • 我目前正在研究Typescript中的重载。 假设我有一个重载的函数: 要么调用函数时没有参数,要么调用函数时有两个参数(foo和bar)。根据vscode的智能感知,结果变量具有布尔|未定义的类型。 为什么即使我已经测试了参数,仍然可以?如果存在,那么类型推断不应该预测也存在吗?

  • 泛型函​​数 在脚本手册中,一些函数的名称后跟有一对尖括号,尖括号中是字符 T 或类型名称: //C# void FuncName<T>(); //JS function FuncName.<T>(): T; 这些被称为是泛型函数。他们的意义在于指定参数类型和(或)返回类型。在 JavaScript 中,泛型函数可以避开动态类型的局限性: // The type is correctly infe

  • 类型和泛型 类型系统的首要目的是检测程序错误。类型系统有效的提供了一个静态检测的有限形式,允许我们代码中明确某种类型的变量并且编译器可以验证。类型系统当然也提供了其他好处,但错误检测是他存在的理由(Raison d’Être) 我们使用类型系统应当反映这一目标,但我们必须考虑到读者(译注:读你代码的人):明智地使用类型可以增加清晰度,而过份聪明只会迷乱。 Scala的强大类型系统是学术探索和实践共

  • 我不想为每个类型T编写这个方法只是为了调用getMessage()并将其传递给下一个方法。 有可能写出这样的方法吗?我只想访问ConstraintViolation接口的方法,这些方法不依赖于类型T(如字符串getMessage())。

  • 同样的规则也可以适用于函数:在使用前给出 <T> 后,类型 T 就变成了泛型。 使用泛型函数有时需要显式地指明类型参量。这种可能的情况包括,调用返回类型是泛型的函数,或者编译器没有足够的信息来推导类型参量。 函数调用使用显式指定的类型参量,如下所示: fun::<A, B, ...>(). struct A; // 具体类型 `A`。 struct S(A); //

  • 问题内容: 我使用Groovy,JUnit和EasyMock为Java应用程序编写单元测试。在EasyMock中,有几种重载方法已被弃用,其注释为“由于执行更严格的擦除操作,因此无法在Java 7中编译”。这些方法将类型为的对象作为参数。除其他外,存在以下方法: … Java不再允许这样做,但是如果您直接从Java调用该代码,则会调用正确的方法。例如,当您执行此代码时 正确的方法(列表中的最后一个