Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何使用包含泛型参数的泛型约束?_Typescript_Typescript Generics - Fatal编程技术网

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,效果很好!谢谢你和琳达的回复和解释!我觉得我现在对一般推理的工作原理有了更好的理解。