Javascript 带有函数的Typescript中的映射类型

Javascript 带有函数的Typescript中的映射类型,javascript,typescript,redux,reselect,Javascript,Typescript,Redux,Reselect,我在使用映射类型时遇到了一些问题 我试图键入一个由redux“选择器”组成的函数(基本上只是a=>B中的函数) 我的目标API基本上是: const bar=组合选择器([ (s:string)=>s.length, (s:string)=>s.trim(), ]) 条//应该是(s:string)=>[数字,字符串] 以下是到目前为止我得到的信息: 类型选择器=(a:a)=>Z 所选类型=T扩展选择器?U:从来没有; 类型MappedSelector=选择器 const selectedNu

我在使用映射类型时遇到了一些问题

我试图键入一个由redux“选择器”组成的函数(基本上只是
a=>B
中的函数)

我的目标API基本上是:

const bar=组合选择器([
(s:string)=>s.length,
(s:string)=>s.trim(),
])
条//应该是(s:string)=>[数字,字符串]
以下是到目前为止我得到的信息:

类型选择器=(a:a)=>Z
所选类型=T扩展选择器?U:从来没有;
类型MappedSelector=选择器
const selectedNumber:Selected=null,如有
selectedNumber//是数字
const baz:MappedSelector=null
baz//是选择器!!!
这似乎很有效,直到我尝试在函数中使用
MappedSelector

type experiableMappedSelector=(…值:T)=>MappedSelector
函数createInferedSelector():ExperiableMappedSelector{…}
const inferredSelectorCreator=createInferredSelector()
const fooSelector:Selector=s=>s.length;
常量条选择器:选择器=s=>s.trim();
常量选择器:[选择器,选择器]=[barSelector,fooSelector]
const baz=推断选择器或创建者(选择器)
baz//是选择器,不是选择器
我也试过:

type experiableMappedSelector=(…值:T)=>MappedSelector
const baz=推断选择器或创建者(选择器)
//由于以下原因未进行打字检查:
//类型为“[Selector,Selector]”的参数不能分配给类型为“Selector”的//参数。
//类型“[Selector,Selector]”未提供与签名//”匹配的内容(a:string):any”。

(最后一点似乎是TS中的一个bug)

您的问题其实很简单
inferredSelectorCreator
接受类型为
T
的rest参数,但是当您调用整个数组调用
inferredSelectorCreator
时,不会扩展它(
inferredSelectorCreator(selectors)
),这意味着
T
将被推断为
[[Selector,Selector]
[选择器,选择器]

如果使用排列,则会得到预期结果:

const bazz = inferredSelectorCreator(...selectors)

你的问题其实很简单。
inferredSelectorCreator
接受类型为
T
的rest参数,但是当你调用时,你调用整个数组的
inferredSelectorCreator
,而不扩散它(
inferredSelectorCreator(selectors)
),这意味着
T
将被推断为
[[选择器,选择器]]
而不是
[选择器,选择器]

如果使用排列,则会得到预期结果:

const bazz = inferredSelectorCreator(...selectors)