typescript - 如何正确扩展数组的泛型返回类型
问题描述
我有一个数据库事务函数,它可以进行多个查询并以 [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'。
解决方案
无需指定任何这些类型;让类型推断做它的事情:
async function AsyncFN() {
// T is always an array of expected results
const transaction = async() => {
return ['str', {id: 1}]
}
const res = await transaction()
}
With --noImplicityAny
and--strictNullChecks
这与详细版本一样类型安全。
一般来说,你应该很少需要强制转换,并且使用强制转换应该是一个很大的危险信号。TypeScript 的类型系统非常强大,几乎总是可以以正确表示运行时发生的事情的方式静态表达类型。
这是错误消息试图告诉您的内容。匿名async
函数是泛型的,其类型参数T
必须是 的子类型any[]
,并且它返回此类型的值T
。在任何情况下,该职能都必须遵守本合同。让我们在不失精髓的情况下稍微简化一下:
function myFunc<T extends any[]>(): T {
return ['str']
}
有人可以将此函数称为:
myFunc<number[]>()
它必须返回一个类型的对象number[]
。但是函数的主体并没有这样做;它只返回一个string[]
.
推荐阅读
- java - 根据证书验证数据
- java - HashMap.get() 在一个片段中有效,而在另一个片段中无效,为什么?
- calendar - 如何在全日历 4.0 日模式下设置事件宽度
- html - JAWS 将标题读取为可点击,即使父 div 没有关联的点击处理程序
- react-native - React Native 将捕获的图像和视频保存到我设备上的自定义文件夹中
- scheme - 如何找出绑定是在哪个 guile 模块中定义的?
- python - 为什么 Dask 数据帧的 compute() 方法很慢,但 head() 方法却很快?
- scala - 如何在 Spark 列中编写函数,以便列中的每个字段增加值?
- java - 使用 java kafka 和 InelliJ 并且 var 带有红色下划线且不允许
- python - 我必须为我制作的每个项目安装 django 吗?