使用 TypeScript 在 Chrome 扩展背景页面中调度 Redux 操作

Posted

技术标签:

【中文标题】使用 TypeScript 在 Chrome 扩展背景页面中调度 Redux 操作【英文标题】:Dispatch Redux action inside Chrome Extension Background Page with TypeScript 【发布时间】:2019-11-08 22:39:36 【问题描述】:

我正在处理 Chrome 扩展程序中的后台页面,该扩展程序使用 Thunk 异步调度 Redux 操作。动作创建者的定义如下:

export const executeProcess = (data: Data[]): ThunkAction<Promise<void>, , , AnyAction> => async (dispatch: ThunkDispatch<, , AnyAction>): Promise<void> => 

我可以使用组件的地图分派到道具从屏幕上完美地分派这个,即:

const mapDispatchToProps = 
    executeProcess: executeProcess,
;

还有:

eventTest = async () => 

        //
        //  Kickoff process
        await this.props.executeProcess(this.props.data);
    ;

还有 JSX 本身:

<button onClick=this.eventTest>EVENT TESTER</button>

我正在尝试在后台页面中做类似的事情,特别是:

chrome.alarms.onAlarm.addListener(async () => 
await store.dispatch(executeProcess(store.getState().data))
);

这样做会引发以下 TS 错误:

Property 'type' is missing in type 'ThunkAction<Promise<void>, , , AnyAction>' but required in type 'AnyAction'.

我正在使用 webext-redux NPM 包,以便我能够在屏幕和后台页面中使用商店,并且能够从后台页面中的商店中读取,但是无法调度操作. dispatch 定义需要一个 AnyAction 类型的实例,即:

export interface AnyAction extends Action

但是 ThunkAction 自然地从 Action 扩展而来:

export type ThunkAction<R, S, E, A extends Action> = (

有什么方法可以更改动作创建者的签名,以便调度在屏幕和背景页面上都没有问题?

我如何使用(上述 NPM)声明我的 store.ts 如下:

const createStoreWithMiddleware = applyMiddleware(reduxThunk)(createStore);
let store: Store<RootState>;

store = createStoreWithMiddleware(reducers, loadState());
store.subscribe(throttle(() => 
    saveState(store.getState())
, 1000));

wrapStore(store, 
    portName: constants.ApplicationName,
);

export store;

【问题讨论】:

【参考方案1】:

实现这项工作的解决方案/kludge,如下定义商店:

let store: Store<RootState, any>;

解决如下:

export interface Store<S = any, A extends Action = AnyAction> 

而不是这个:

let store: Store<RootState>;

理想情况下会传递 ThunkAction 而不是任何类型,但会遇到泛型参数问题。

【讨论】:

以上是关于使用 TypeScript 在 Chrome 扩展背景页面中调度 Redux 操作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Chrome 调试 React TypeScript .tsx 文件 - Webpack

Chrome 开发工具失去了 TypeScript 的语法高亮显示

chrome 72 更改源映射行为

打字稿:使用类型进行显式导入

TypeScript 中的 NDEFReader

chrome 未定义 - Mocha 和 Typescript