【发布时间】:2018-04-04 09:11:50
【问题描述】:
这是一个通用的打字稿问题,但我将根据我目前正在开发的 react-redux 应用程序进行解释。如有必要,我可以提出一般示例,但希望现在就足够了。 我正在尝试将 redux-thunk react 应用程序中的 actionCreators 映射到已经向它们注入了 dispatch 和 getState 的类型。我有:
export interface AppThunkAction<TAction= {}, TDispatchResponse = void, TActionResponse = void> {
(dispatch: (action: TAction) => TDispatchResponse, getState: () => ApplicationState): TActionResponse;
}
我的动作创建者看起来像这样:
@typeName('BAR_ACTION')
export class BarAction extends Action {
constructor() {
super();
}
}
@typeName('FOO_ACTION')
export class FooAction extends Action {
constructor(public baz: string) {
super();
}
}
export const actionCreators = {
foo: (baz: string): AppThunkAction<FooAction, void, Promise<void>> => (dispatch, getState): Promise<void> => {
return new Promise((resolve, reject) =>
resolve(dispatch(new FooAction(baz)))
);
},
bar: (): AppThunkAction<BarAction, void, Promise<number>> => (dispatch, getState): Promise<number> => {
return new Promise((resolve, reject) => {
dispatch(new BarAction());
resolve(3);
});
},
};
这些对象由 redux-thunk 中间件处理,所以实际的类型(我需要为组件指定)看起来像这样
export type actionCreatorsTypes = {
foo: (baz: string) => Promise<void>,
bar: () => Promise<number>,
};
问题是我必须手动编写这些类型定义,如果我忘记更改它们、打错字等等,事情就会变得一团糟。
因此,我正在寻找自动处理此问题的方法。一个函数或装饰器,它将遍历此类型并进行修改,就好像注入了 dispatch 和 getState。我已经查看了 typescript 中的映射类型,但到目前为止,我很难创建比简单选择或简单映射更复杂的东西。
有人对如何处理这个问题有提示吗?
【问题讨论】:
-
在我看来类似 CreateTypes
= { [P in keyof T]: T[P]; };类型 c = CreateTypes ;正在朝着正确的方向前进。我只需要找出需要用什么来代替 T[P];为了修改该属性的类型 -
现在可以使用 TypeScript 3,请参阅:stackoverflow.com/a/52187113/2844025
-
太棒了,谢谢你告诉我!我会调查的。
标签: typescript