Javascript 返回类型应定义回调参数类型

Javascript 返回类型应定义回调参数类型,javascript,typescript,types,type-inference,Javascript,Typescript,Types,Type Inference,为什么参数children是unknown[] 它应该被推断为string[],因为我返回的是'asdf',我的函数定义是: mapFunction:(子项:K[])=>K,) 我做错了什么 function returnTypeDefinesParamType<K>(mapFunction: (children: K[]) => K,):void{ // ... some code } returnTypeDefinesParamType( (children)=&

为什么参数
children
unknown[]

它应该被推断为
string[]
,因为我返回的是'asdf',我的函数定义是:
mapFunction:(子项:K[])=>K,)

我做错了什么

function returnTypeDefinesParamType<K>(mapFunction: (children: K[]) => K,):void{
    // ... some code
}
returnTypeDefinesParamType( (children)=>{
    return 'asdf';
})
function returnTypeDefinesParamType(映射函数:(子项:K[])=>K,):void{
//…一些代码
}
returnTypeDefinesParamType((子项)=>{
返回“asdf”;
})
返回类型定义参数类型((子项)=>{
返回“asdf”;
})

我认为这是一个例子;编译器尝试上下文类型<代码>子< /代码>之前,它有一个完整回调的类型,然后可以推断<代码> k>代码>(这是一个非常规的名称BTW,<代码> k>代码>通常表示键入类型;这里只考虑代码> t>代码>,它不能做到这一点。推理失败,
K
成为最广泛的类型:
未知
。这并不一定是错误的,因为没有注释的情况下,
children=>“asdf”
可分配给
(children:unknown[])=>unknown
,但它对您没有用处。GitHub中的这个问题被标记为bug,但还不清楚是否会对此采取措施;我认为这更多的是设计上的限制

在任何情况下,如果您想解决这个问题,您都需要在某个地方手动注释或指定类型。一种方法是注释回调参数:

returnTypeDefinesParamType((children: string[]) => {
    return 'asdf';
});
returnTypeDefinesParamType<string>((children) => {
    return 'asdf';
}); 
也可以手动指定类型参数:

returnTypeDefinesParamType((children: string[]) => {
    return 'asdf';
});
returnTypeDefinesParamType<string>((children) => {
    return 'asdf';
}); 
returnTypeDefinesParamType((子项)=>{
返回“asdf”;
}); 
无论哪种方式,您都会被困在向编译器解释事情的过程中,以弥补其推理能力的限制


此答案缺少对解决问题原因的解释。这里您是在函数上声明类型参数,参数依赖于该类型。编译器无法从参数推断。不是作为注释,而是在您的答案中。Stackoverflow正在寻找有助于提出问题的人的答案,并作为未来查询的参考,您的答案可能会有所帮助。