Typescript 如何使用包含泛型参数的泛型约束?
我一直被这个问题的各种变化所困扰。假设出于某种原因,我想定义一个函数式的Typescript 如何使用包含泛型参数的泛型约束?,typescript,typescript-generics,Typescript,Typescript Generics,我一直被这个问题的各种变化所困扰。假设出于某种原因,我想定义一个函数式的forEach,它接受扩展Iterable的任何类型,并返回扩展Iterable的相同类型。(我知道Array.prototype.forEach有一个undefined返回,我想写的版本不同。) 例如,forEach([1,2,3],x=>which(x))的类型是number[],而不是Iterable 以下是我所掌握的信息: 导出函数forEach( 国际热核实验堆, f:(val:T,索引:number,iter:i
forEach
,它接受扩展Iterable
的任何类型,并返回扩展Iterable
的相同类型。(我知道Array.prototype.forEach
有一个undefined
返回,我想写的版本不同。)
例如,forEach([1,2,3],x=>which(x))
的类型是number[]
,而不是Iterable
以下是我所掌握的信息:
导出函数forEach(
国际热核实验堆,
f:(val:T,索引:number,iter:iter)=>未知
):ITER{
设i=0;
用于(国际热核实验堆常数x){
f(x,i,iter);
i++;
}
返回iter;
}
到目前为止还不错,但当我尝试使用它时,我遇到了类型问题:
const result=forEach([1,2,3],(x,i,iter)=>{
控制台日志(x*2);
});
result
这里是一个number[]
,根据需要,但是x
参数是unknown
而不是number
,当我尝试将它乘以2时,编译器会抱怨。我一直在用infer
胡闹,但我只是把事情弄得一团糟。为什么x
被推断为未知
当泛型参数替换发生时(即调用函数时),仔细检查编译器推断出的实际函数签名是什么,这是没有坏处的。以下是您案例中的情况:
函数forEach(iter:number[],f:(val:unknown,index:number,iter:number[])=>unknown:number[]
编译器能够计算出ITER
是一个number[]
,因为类型信息存在于作为第一个参数传入的数组文本中。但是T
的类型仅用作回调中val
参数的类型。由于传入的回调不是显式类型,x
的类型是未知的,因此x
被推断为unknown
该做什么
这个解决方案的功劳完全在于,所以我只提供一些解释。它的核心是以下实用程序,它允许我们通过推断值的类型并返回值来获取迭代器生成的值的类型:
键入IterateeI我现在懒得写答案,但这似乎奏效了:谢谢@Linda,效果很好!谢谢你和琳达的回复和解释!我觉得我现在对一般推理的工作原理有了更好的理解。