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

Typescript 如何正确扩展数组的泛型返回类型,typescript,Typescript,我有一个数据库事务函数,可以进行多个查询,并以[resultQuery1、resultQuery2等格式返回每个查询的结果]。我不确定如何为这个泛型函数提供预期的返回类型 例如: type Author = string type Book = { id: number } type PossibleArrayResponseOfTypes = [Author, Book] // or [Author, Book, and more] async function AsyncFN() {

我有一个数据库事务函数,可以进行多个查询,并以[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()
}
type Author=string
类型Book={id:number}
键入possibleAryResponseOfTypes=[Author,Book]//或[Author,Book,and more]
异步函数AsyncFN(){
//T始终是预期结果的数组
const transaction=async():Promise=>{
return['str',{id:1}]
}
const res=等待事务()
}
错误:

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


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

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

  const res = await transaction()
}
使用
--noImplicityAny
--strictNullChecks
这与详细版本一样具有类型安全性

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


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

function myFunc<T extends any[]>(): T {
  return ['str']
}
函数myFunc():T{ 返回['str'] } 有人可以将此函数称为:

myFunc<number[]>()
myFunc()

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

hm,我想我现在可以将return转换为任何类型:/Yes,它似乎与转换一起工作。。。但是,为什么不在这个任务中使用Observable?@Yennefer我不喜欢rxjs,angular['str',{id:1}]是非常特定的类型,而不是泛型。您的函数具有多态类型,但在您的实现中只有单态体
return['str',{id:1}]
是一个问题。没有类型问题。你能不能把你想达到的目标重新表述一下。但是这种方式是可以的。。这不是一种类型脚本方式,关键不是函数的实际调用方式。关键是如何调用它,有人可以用显式类型参数这样调用它。这就是为什么编译器禁止返回可能破坏函数契约的内容。如果希望允许,只需编写
函数myFunc():any[]
,但调用方不知道将返回什么类型。我希望有一种方法可以强制提供数组类型并使其工作。为什么不将返回类型声明为
possibleAryResponseOftypes
?这是函数返回的唯一内容。不需要任何泛型。正如@Thomas所说,你是如何放置泛型的,函数是非常特定于一个且唯一的类型的。