Typescript 提取泛型类型的返回类型和参数类型

Typescript 提取泛型类型的返回类型和参数类型,typescript,redux,Typescript,Redux,为了使它有意义,让我们看看这个看起来像react useReducer的小型天真实现 type Reducer=(prevState:S,action:A)=>S; 类型Dispatch=(值:A)=>void; 函数useReducer(reducer:reducer,initState:S):[getState:()=>S,dispatcher:Dispatch]{ 让状态=初始状态; 返回[ ()=>州, 动作=>state=reducer(状态,动作) ]; } //它的工作如预期(但这

为了使它有意义,让我们看看这个看起来像react useReducer的小型天真实现

type Reducer=(prevState:S,action:A)=>S;
类型Dispatch=(值:A)=>void;
函数useReducer(reducer:reducer,initState:S):[getState:()=>S,dispatcher:Dispatch]{
让状态=初始状态;
返回[
()=>州,
动作=>state=reducer(状态,动作)
];
}
//它的工作如预期(但这不是问题)
类型计数动作=
|{type:“inc”}
|{type:“dec”}
|{类型:“重置”;有效负载?:编号};
const[getState,dispatch]=useReducer(
(状态、动作)=>{
如果(action.type==“inc”){
返回状态+1;
}
如果(action.type==“dec”){
返回状态-1;
}
如果(action.type==“重置”){
返回动作?有效载荷?0;
}
返回状态;
},
0
)
getState()//0
分派({type:'inc'})
分派({type:'inc'})
getState()//2
分派({type:'dec'})
getState()//1
分派({type:'reset',负载:2})
getState()//2
分派({type:'reset'})
getState()//0
我的问题是:有没有一种方法可以编写useReducer的内部类型,只派生一个条目,即Reducer类型

您将如何编写
ExtractSFrom
ExtractAFrom

//理想情况下,我希望有一个定义像真实事物一样的东西;)
函数useReducer(reducer:R,initState:ExtractSFrom):[getState:()=>ExtractSFrom,dispatcher:(值:ExtractAFrom)=>void]{
让状态=初始状态;
返回[
()=>州,
动作=>state=reducer(状态,动作)
];
}

提前感谢

这正是
推断
关键字的作用。如果您检查实际的
useReducer
钩子,您将看到React正在从reducer函数推断
状态
动作
的类型

type ReducerState<R extends Reducer<any, any>> = R extends Reducer<infer S, any> ? S : never;
type ReducerAction<R extends Reducer<any, any>> = R extends Reducer<any, infer A> ? A : never;

其中generic是reducer函数,
State
Action
的类型都是从中派生出来的。

在第二个代码示例中,type
R
是否有任何约束?在第一个代码示例中,我假设您希望将其限制为扩展
Reducer
类型(
(prevState:S,action:A)=>S
),这是否正确?是否有帮助?您可以这样做,但我不太明白您为什么希望使用此版本而不是现有版本?从
R
中推断
S
A
所涉及的更复杂的类型杂耍有什么好处吗?非常感谢,这正是我想要的
function useReducer<R extends Reducer<any, any>>(
    reducer: R
): [ReducerState<R>, Dispatch<ReducerAction<R>>];