首页 > 解决方案 > 如何正确扩展数组的泛型返回类型

问题描述

我有一个数据库事务函数,它可以进行多个查询并以 [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()
}

错误:

类型 '(string | { id: number; })[]' 不可分配给类型 'T'。'(string | { id: number; })[]' 可分配给类型'T' 的约束,但可以使用约束'any[]' 的不同子类型来实例化'T'。

标签: typescript

解决方案


无需指定任何这些类型;让类型推断做它的事情:

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

  const res = await transaction()
}

With --noImplicityAnyand--strictNullChecks这与详细版本一样类型安全。

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


这是错误消息试图告诉您的内容。匿名async函数是泛型的,其类型参数T必须是 的子类型any[],并且它返回此类型的值T。在任何情况下,该职能都必须遵守本合同。让我们在不失精髓的情况下稍微简化一下:

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

有人可以将此函数称为:

myFunc<number[]>()

它必须返回一个类型的对象number[]。但是函数的主体并没有这样做;它只返回一个string[].


推荐阅读