Typescript 减速器自定义分派类型,不可分配,属性类型‘;派遣’;不相容

Typescript 减速器自定义分派类型,不可分配,属性类型‘;派遣’;不相容,typescript,redux,redux-actions,Typescript,Redux,Redux Actions,我现在有一个简单的减速器和动作类型。在设置测试时,我遇到了一个type def问题,返回了我的store,引用了我的“自定义”操作类型声明。我看到一个错误: 类型“Store”不可分配给类型“Store” 为什么调用combineReducers()时会返回SetSelectedAccount?globalReducer正在处理SetSelectedAccount的操作 在出现上述错误的我的测试设置文件中: export function createTestStore(isInternal:

我现在有一个简单的减速器和动作类型。在设置测试时,我遇到了一个type def问题,返回了我的
store
,引用了我的“自定义”操作类型声明。我看到一个错误:

类型“Store”不可分配给类型“Store”

为什么调用
combineReducers()
时会返回
SetSelectedAccount
globalReducer
正在处理
SetSelectedAccount
的操作

在出现上述错误的我的测试设置文件中:

export function createTestStore(isInternal: boolean): Store {
  const store: Store<CombinedState<{
    global: GlobalStateShape;
    }>, SetSelectedAccount> = createStore(rootReducer, { global: 
     getGlobalInitialState(isInternal) });
  return store;
}
动作。ts

export const rootReducer: Reducer<CombinedState<{
    global: GlobalStateShape;
}>, SetSelectedAccount> = combineReducers({
  global: globalReducer,
});
const composedEnhancer = composeWithDevTools(
  applyMiddleware()
);

export const store: Store<CombinedState<{
  global: GlobalStateShape;
}>, SetSelectedAccount> = createStore(rootReducer, composedEnhancer);
const SET_SELECTED_ACCOUNT = 'SET_SELECTED_ACCOUNT';

export const GlobalActions = {
  SET_SELECTED_ACCOUNT,
};

export interface SetSelectedAccount {
  type: typeof SET_SELECTED_ACCOUNT;
  payload: { accountId: string; selectedApp: AppsList };
}

export type GlobalActionTypes = SetSelectedAccount;

FWIW,如果我添加第二个操作,那么
SetSelectedAccount
将变成上面的返回类型
GlobalActionTypes
,这是关于不匹配的相同结果和错误消息
dispatch

谢谢大家!

问题 问题在于
createTestStore
函数的返回类型。您创建了一个特定类型的存储(
store
),然后将其作为不带泛型的
store
返回。
Store
的默认类型是您在错误消息中看到的
Store

您可能会认为这不会是一个问题,因为您的存储更具体,所以它应该可以分配给
存储
,对吗?但是,当您处理函数参数(如
Dispatch
的参数)时,特殊性会倒退。返回类型表示您返回的存储能够分派
任何操作
,但实际上您只能分派类型
SetSelectedAccount
,因此您的存储不能分配给更广泛的类型

解决 最简单的方法就是完全删除返回类型
:State
。您已经输入了要返回的
store
变量,因此您并不真正需要它

您还可以将类型注释从变量
store
移动到函数return。仅供参考,redux
CombinedState
实用程序类型实际上不起任何作用,
CombinedState
{global:GlobalStateShape;}

export function createTestStore(isInternal: boolean): Store<{ global: GlobalStateShape; }, SetSelectedAccount> {
    return createStore(rootReducer, {
        global: getGlobalInitialState(isInternal)
    });
}
导出函数createTestStore(isInternal:boolean):存储{ 返回createStore(rootReducer{ 全局:getGlobalInitialState(isInternal) }); }
谢谢。我包括了显示的返回类型,例如
Store
,只是为了帮助显示TSLinter对该类型的看法。我需要声明一个带有linting设置的返回类型,结果是
Store
按照您的建议工作。@Linda Paiste,还有一个问题要问你:如果我添加第二个
商店
要返回,会发生什么?分派返回类型是否看起来像一个联合体<代码>存储?
export function createTestStore(isInternal: boolean): Store<{ global: GlobalStateShape; }, SetSelectedAccount> {
    return createStore(rootReducer, {
        global: getGlobalInitialState(isInternal)
    });
}