【问题标题】:Typescript & Redux connect打字稿和 Redux 连接
【发布时间】:2019-04-23 07:16:26
【问题描述】:

我正在尝试使用 Typescript 将 redux 连接到组件并一直遇到相同的错误。

“typeof BaseLayoutUnconnected”类型的参数不可分配给 'Component ' 类型的参数。属性“setState”是 在“typeof BaseLayoutUnconnected”类型中缺失。

import * as React from 'react';
import { IBaseLayoutProps, IBaseLayoutState } from './base-layout.types';
import { ChatContainer } from '../../components';
import { connect, DispatchProp } from 'react-redux';
import { bindActionCreators, Dispatch } from 'redux';
import { RouteComponentProps } from 'react-router';
import { ChatActions } from 'app/actions';
import { RootState } from 'app/reducers';
import { omit } from 'app/utils';

export const mapStateToProps = (state: RootState, ownProps) => {
    return {
        chatItems: state.chatItems
    };
};

export const mapDispatchToProps = (dispatch: Dispatch) => ({
    actions: bindActionCreators(omit(ChatActions, 'Type'), dispatch)
});

export class BaseLayoutUnconnected extends React.Component<IBaseLayoutProps, IBaseLayoutState> {
   constructor(props) {
        super(props);
        this.state = {};
    }

    render() {
        const { actions, chatItems } = this.props;
        return <ChatContainer actions={actions} chatItems={chatItems} />;
    }
}

export const BaseLayout = connect(
    mapStateToProps,
    mapDispatchToProps
)(BaseLayoutUnconnected);

这是在我的 app.tsx 中通过

调用的
 <Route exact={true} path="/" component={BaseLayout} />

这是道具和状态

export interface IBaseLayoutProps {
    chatItems: RootState.ChatState;
    actions: ChatActions;
}

export interface IBaseLayoutState {}

ChatActions 看起来像

import { createAction } from 'redux-actions';
import { ChatItemModel } from 'app/models';

export namespace ChatActions {
    export enum Type {
        ADD_CHAT_ITEM = 'ADD_CHAT_ITEM'
    }

    export const addChatItem = createAction<PartialPick<ChatItemModel, 'text'>>(Type.ADD_CHAT_ITEM);
}

export type ChatActions = Omit<typeof ChatActions, 'Type'>;

【问题讨论】:

  • 尝试为this.state添加默认值
  • 添加构造函数(props) { super(props); this.state = {}; } 不能解决问题。编辑了原始问题以包含该问题。

标签: reactjs typescript redux react-redux


【解决方案1】:

这也是我刚开始使用 Redux 和 TypeScript 时遇到的问题。有一个棘手的解决方案。连接方法需要很多泛型。我试着用你的例子来解释一下。

首先你必须拆分 BaseLayoutUnconnected 的属性。

export interface IBaseLayoutStateProps {
    chatItems: RootState.ChatState;
}

export interface IBaseLayoutDispatchProps {
    actions: ChatActions;
}

export interface IBaseLayoutOwnProps {
    // put properties here you want to make available from the connected component
}

export type IBaseLayoutProps = IBaseLayoutOwnProps & IBaseLayoutDispatchProps & IBaseLayoutStateProps 

export interface IBaseLayoutState {}

然后你必须填充不同redux函数的泛型。

const mapStateToProps: MapStateToProps<IBaseLayoutStateProps, {}, RootState> = (state: RootState): IBaseLayoutStateProps => ({
    chatItems: state.chatItems
})

export const mapDispatchToProps: MapDispatchToPropsFunction<IBaseLayoutDispatchProps, IBaseLayoutOwnProps> = (dispatch: Dispatch, ownProps: IBaseLayoutDispatchProps): IBaseLayoutDispatchProps => ({
    actions: bindActionCreators(omit(ChatActions, 'Type'), dispatch)
});

export default connect<IBaseLayoutStateProps , IBaseLayoutDispatchProps, IBaseLayoutOwnProps , RootState>(
    mapStateToProps,
    mapDispatchToProps
)(BaseLayoutUnconnected as any)

一个很好的来源,你可以在这里找到我写的所有这些东西,更多的是this repository

【讨论】:

  • 谢谢@Sly321。按照您的建议更改了所有内容,但出现了类似的错误。它现在说“'typeof BaseLayoutUnconnected' 类型的参数不可分配给'Component ' 类型的参数。'typeof BaseLayoutUnconnected' 类型中缺少属性 'setState'。”
  • 你从哪里得到错误?在路由器中还是在连接功能中?你有我可以检查源代码的存储库吗?
  • 连接函数出现错误。 BaseLayoutUnconnected(在连接函数中)带有下划线。
  • 另一个想法,尝试在连接中调用 BaseLayoutUnconnect 像这样 connect(mapStateToProps, mapDispatchToProps)(BaseLayoutUnconnect as any as React.Component)。如果这仍然错误,那么您的 @types 配置有问题
  • BaseLayoutUnconnect 任何工作!将其添加到您的答案中并接受它。
猜你喜欢
  • 2018-10-04
  • 2016-11-09
  • 2018-04-16
  • 2020-06-30
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
相关资源
最近更新 更多