【发布时间】:2020-12-23 23:00:54
【问题描述】:
我在一个对集合执行异步函数的项目上有这个无类型函数,我想指定它的类型以获得更好的 IDE 帮助 - 我希望 IDE 推断回调时的第一个参数与数组内部类型相同.
这是函数:
export async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
我添加了类似这样的明显类型,但出现了问题:
export async function asyncForEach<T>(
items: T[],
callback: (item: T, idx: number, items: T[]) => Promise<any>
): Promise<void> {
for (let index = 0; index < items.length; index += 1)
await callback(items[index], index, items);
}
之后我得到了下一个场景:
- 当第一个参数是类型化数组
[]时,第一个回调参数被正确推断为 - 当第一个参数是普通数组 [] 时,第一个回调参数被正确推断为 any
- 问题:当第一个参数是“any”类型变量时,第一个回调参数现在被推断为“unknown”而不是“any” 回调参数类型推断的这种变化导致遗留代码的几个构建问题,这些代码很高兴访问“任何”变量的属性,但如果变量“未知”则中断。
我希望能够在回调参数类型中指定一个三元组,这样如果它将是“未知”,而不是“任何”。
这是我做过的几次尝试之一,但没有成功 - 编译器拒绝构建并且类型推断停止工作。
export async function asyncForEach<T>(
items: T[],
callback: (item: T extends unknown ? any: T, idx: number, items: T[]) => Promise<any>
): Promise<void> {
for (let index = 0; index < items.length; index += 1)
await callback(items[index], index, items);
}
有人知道如何解决(item: T extends unknown ? any: T, 部分吗?
非常感谢。
【问题讨论】:
标签: typescript typescript-generics