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

如何正确扩展数组的泛型返回类型

长孙承嗣
2023-03-14

我有一个数据库事务函数,可以进行多个查询,并以[resultQuery1、resultQuery2等格式返回每个查询的结果]。我不确定如何为这个泛型函数提供预期的返回类型。

游戏场

示例:

type Author = string
type Book = { id: number }
type PossibleArrayResponseOfTypes = [Author, Book] // or [Author, Book, and more]


async function AsyncFN() {
  // T is always an array of expected results  
  const transaction = async <T extends any[] = any[]>(): Promise<null | T> => {
   return ['str', {id: 1}]
  }

  const res = <PossibleArrayResponseOfTypes>await transaction()
}

错误:

类型“(字符串|{id:number;})[]不可分配给类型“T”(字符串|{id:number;})[]”可分配给类型为“T”的约束,但“T”可以用约束“any[]”的不同子类型实例化。

共有1个答案

笪煌
2023-03-14

无需指定这些类型中的任何一种;让类型推断完成它的工作:

async function AsyncFN() {
  // T is always an array of expected results  
  const transaction = async() => {
   return ['str', {id: 1}]
  }

  const res = await transaction()
}

使用--noInimplatiyany--stritNullChecks,这和冗长的版本一样是类型安全的。

一般来说,您应该很少需要强制类型转换,并且强制类型转换的使用应该是一个巨大的危险信号。TypeScript的类型系统功能非常强大,几乎总是可以以正确表示运行时发生的情况的方式静态表示类型。

下面是错误消息试图告诉您的内容。匿名async函数是泛型函数,其类型参数T必须是any[]的子类型,并返回此类型的值T。在任何情况下,职能部门都必须遵守本合同。让我们把它简化一点,但不要失去本质:

function myFunc<T extends any[]>(): T {
  return ['str']
}

有人可以将这个函数称为:

myFunc<number[]>()

它必须返回类型为number[]的对象。但函数体并没有做到这一点;它只返回字符串[]

 类似资料:
  • 问题内容: 我有一个类,可以根据消息的类将传入的消息映射到匹配的读者。所有消息类型都实现接口消息。读者在mapper类中注册,说明它将能够处理的消息类型。这些信息需要以某种方式存储在消息阅读器中,而我的方法是从构造函数中设置一个数组。 现在,似乎我对泛型和/或数组有些误解,似乎无法弄清楚,请参见下面的代码。它是什么? ETA : 正如cletus正确指出的那样,最基本的谷歌搜索表明Java不允许通

  • 问题内容: 我收到一个错误,程序中有这个结构 错误指向Circle扩展Shapes < T >类,其中指出“ T无法解析为类型”。如果将T设置为字符串,错误将消失,但这也意味着我只能使用一种数据类型。我应该在<>中放入什么,以便可以使用任何数据类型(字符串,整数,双精度型等),或者这样做是错误的? 问题答案: 有两个不同的概念。当你写 这意味着您正在创建一个类,该类在实例化时将被某个类参数化。您不

  • 问题内容: 是否可以在没有警告警告的情况下模拟(带有模拟)签名方法?我试过了: 但无论我如何声明,我总是会遇到编译错误。例如当我这样宣布 我收到标准的通用/ mockito编译错误 问题答案: 使用doReturn-when备用存根语法。 被测系统: 和测试用例: 无需错误或警告抑制

  • 问题内容: 我偶然发现了对Java继承的好奇心,我希望您对此提出更好的想法: 假设两个接口A和A1 接口A1扩展了A 接口A具有返回泛型类型的方法。 通用类型将是。 现在的基本思想是将这种通用返回类型从接口A中更改 为 接口A1中的 一开始似乎很容易(不好的事情会在以后出现) 我们将接口A声明为 和接口A1一样 如您所见,我们被迫编写接口A本身,以允许使用基于泛型的“子类”覆盖它。(实际上,gen

  • 问题内容: 我正在尝试重构M类型确实扩展了任何内容的类和子类集,即使我们知道它必须是某种类型的子类也是如此。该类型已参数化,我希望其参数化类型可用于已经具有M值的子类。 有什么方法可以定义此类,而不必在参数列表中包括冗余的K和V泛型类型。我希望能够使编译器从子类映射到的M中推断出它们。 换句话说,我希望类声明看起来像这样: 从M的定义可以推断出K和V的类型。 问题答案: 问题在于,它们并没有真正地

  • 对于一堆带有泛型的包装类,我的继承结构遇到了一些麻烦。这基本上是结构: 这将与当前代码一起编译和工作,但是,这似乎很危险。如果调用方像这样使用这个方法:,它将很好地编译,但是如果findMiddle尝试返回SubBWrapper,则在运行时会有一个ClassCastException。我以为行得通却行不通的是: 所以我的问题基本上是,有没有正确的方法来编写编译、运行并遵循最佳实践的方法findMi