使用Typescript类型确保所有操作类型都由reducer处理

使用Typescript类型确保所有操作类型都由reducer处理,typescript,redux,Typescript,Redux,我尝试在typescript中创建一种模式匹配,特别是在这里创建Redux缩减器 我真的希望能够提前指定减速器必须处理特定类型的所有操作。我试图通过创建一个由action类型设置关键帧的对象来实现这一点,该对象的值是约简。此映射的类型如下所示: 导出接口定向操作{ 类型:T; } 接口IReducer{ (国家:S,行动:A):S; } 导出类型IActionReducerMapping=记录; 这就是我计划的大部分内容;为给定操作类型创建的任何映射都必须实现所有类型的操作。问题是,在我如何设

我尝试在typescript中创建一种模式匹配,特别是在这里创建Redux缩减器

我真的希望能够提前指定减速器必须处理特定类型的所有操作。我试图通过创建一个由action类型设置关键帧的对象来实现这一点,该对象的值是约简。此映射的类型如下所示:

导出接口定向操作{
类型:T;
}
接口IReducer{
(国家:S,行动:A):S;
}
导出类型IActionReducerMapping=记录;
这就是我计划的大部分内容;为给定操作类型创建的任何映射都必须实现所有类型的操作。问题是,在我如何设置键入的情况下,映射中的约简器无法推断其操作的确切类型。例如:

接口IUser{
id:编号;
名称:字符串;
年龄:人数;
}
接口状态{
[id:编号]:IUser;
}
接口IAddUserAction{
键入:“添加用户”;
有效载荷:IUser;
}
界面交互作用{
键入:“设置用户名称”;
有效载荷:{
id:IUser['id'];
名称:IUser['name'];
}
}
类型UserAction=IAddUserAction | IsetUserAction;
常量映射:IActionReducerMapping={
//此处action只知道UserAction上的属性
//理想情况下,它应该知道它可以访问
//IAddUserAction
“添加用户”:(状态、操作)=>({
状态
[action.payload.id]:action.payload,
}),
“设置用户名称”:(状态、操作)=>({
状态
[action.payload.id]:{
…状态[action.payload.id],
名称:action.payload.name,
}
}),
};
问题是,每个reducer中的操作都只是union类型的UserAction,因此,例如,age是不可访问的。有没有一种方法可以使用这种模式设置打字,以便:

  • 我可以确保以某种方式处理所有动作类型
  • 我可以设置减速器,它知道给定的动作类型

  • 通过使用映射所有类型的自定义映射类型(
    a['type']
    ),并使用
    提取
    条件类型为每个类型名称获取正确的操作类型,可以解决
    操作
    类型不正确的问题

    
    export type IActionReducerMapping<S, A extends IReduxAction<string>> = {
        [K in A['type']]: IReducer<S, Extract<A, { type: K }>>
    };
    
    
    导出类型IActionReducerMapping={
    
    [K in A['type']]:我很好,谢谢你;工作很好,应该会让生活更轻松我运行此程序时出错,我想知道你是否有任何想法;我将打开一个新问题我打开了一个新问题;我有机会了解你的想法吗?