Основной причиной проблемы является то, что redux-thunk
является промежуточным программным обеспечением, которое выполняется redux
, поэтому оно вызывает функцию (thunk) и возвращает значение. Однако TypeScript не «осознает», что происходит, поэтому нет способа его правильно набрать (без небольшой дополнительной работы).
Пакет redux-thunk
(в настоящее время) на самом деле поставляется с определениями типов,Однако в его определениях типов произошел ряд значительных улучшений, но не было релизов. Похоже, что в версии 3.0 они будут удалены и перемещены в DefinitiveTyped (устанавливается через @types/redux-thunk
).
Но до тех пор вы можете настраивать типы самостоятельно. Если вы сравните то, что выпущено сегодня против того, что находится в репо , то сравнительно больше определений типов.
Чтобы использовать их (до того, как они будут выпущены в новой версии)из redux-thunk
или DefiniteTyped), вы можете создать файл типов (например: types.d.ts
) со следующими данными:
import { ActionCreatorsMapObject } from "redux";
import { ThunkAction } from "redux-thunk";
/**
* Redux behaviour changed by middleware, so overloads here
*/
declare module "redux" {
/**
* Overload for bindActionCreators redux function, returns expects responses
* from thunk actions
*/
function bindActionCreators<
TActionCreators extends ActionCreatorsMapObject<any>
>(
actionCreators: TActionCreators,
dispatch: Dispatch
): {
[TActionCreatorName in keyof TActionCreators]: ReturnType<
TActionCreators[TActionCreatorName]
> extends ThunkAction<any, any, any, any>
? (
...args: Parameters<TActionCreators[TActionCreatorName]>
) => ReturnType<ReturnType<TActionCreators[TActionCreatorName]>>
: TActionCreators[TActionCreatorName]
};
}
Он извлекается непосредственно из того, что находится в репо сегодня. Если вам нужно больше, вы можете скопировать весь файл, но этот фрагмент должен решить вашу проблему.
Затем обновите ваш вызов до bindActionCreators
, чтобы передать объект и вывести эти типы (это не обязательно дляmapStateToProps
, но я считаю, что легче избежать "двойной" типизации):
type DispatchProps = ReturnType<typeof mapDispatchToProps>;
const mapDispatchToProps = dispatch => {
return bindActionCreators({ requestAuthenticationAsync }, dispatch);
};
type StateProps = ReturnType<typeof mapStateToProps>;
const mapStateToProps = state => ({
authenticated: state
});
type Props = DispatchProps & StateProps;
class Gateway extends React.Component<Props> {
// ...
}
Типы могут быть обновлены, но с типами в репо redux-thunk
сегодня они ожидаютпервый аргумент bindActionCreators
должен быть объектом (хотя в документах говорится, что это может быть либо функция, которую вы использовали, либо объект ), глядя на TActionCreators extends ActionCreatorsMapObject<any>
.
Thisтеперь должен правильно набрать this.props.requestAuthenticationAsync
для использования в вашем компоненте.
onGatewaySubmit = event => {
event.preventDefault();
const { requestAuthenticationAsync } = this.props;
const { email, password } = this.state;
// Type:
// (email: string, password: string) => Promise<void>
requestAuthenticationAsync(email, password).then(() => {
console.log("done");
});
};