带有连接的Typescript Redux编译错误(组件与签名不匹配)

时间:2018-09-13 08:06:13

标签: typescript react-redux

我有一个不会编译的打字稿react / redux组件。我还有其他几乎完全相同的组件并且可以编译。我需要了解为什么这个不编译。

非编译组件源(完整):

import * as React from 'react';
import { connect } from 'react-redux';
import { ApplicationState } from '../store';

interface ToastProps {
    messages: string[]
}

 interface FadeState {
    visible: boolean
}

class ToastBar extends React.Component<ToastProps, FadeState> {
    public render() {
        if (this.props.messages.length > 0) {
            this.state = { visible: true };
        } else {
            this.state = { visible: false };
        }
        let key = 0;
        return <div id="toastbar" className={this.state.visible ? 'show' : ''}>
            {this.props.messages.map(function (listValue) {
                return <p key={++key}>{listValue}</p>;
            })}            
        </div>;
    }
}

const mapStateToProps = (state: ApplicationState, ownProps?: ToastProps) => ({
    messages: state ? state.toastMessages.messages : []
});

export default connect(mapStateToProps, {}, null, { pure: false })(ToastBar);

我从IDE以及运行npm run-script构建中得到以下错误消息:

  

(9,82):类型'typeof ToastBar'的参数不可分配给   类型为“ ComponentType>”的参数。类型“ typeof ToastBar”不可分配给类型   “ StatelessComponent>”。       类型'typeof ToastBar'不提供与签名'(props:Shared <{messages:String [];},ToastProps>&{children ?:   ReactNode; },上下文?:任何):ReactElement |空”。

这里是另一个可以正常编译的组件:

import * as UserStore from '../store/UserManagement';
import * as React from 'react';
import { RouteComponentProps } from 'react-router';
import { ApplicationState } from '../store';
import { connect } from 'react-redux';
import { User, UserRole } from '../model/User';
import { UserEditDialog } from './UserEditDialog';

interface UserMgmtState {
    isLoading: boolean;
    users: User[];
    currentUser: User;
}

interface UserEditState {
    editingUser: User | null;
}

type DispatchProps = typeof UserStore.actionCreators;
type UserManagementProps = UserMgmtState & DispatchProps & RouteComponentProps<{}>;

class UserManagement extends React.Component<UserManagementProps, UserEditState> {

    componentWillMount() {
        // snipped
    }

    editUser(user: User) {
        this.setState({
            editingUser: user
        }); 
    }

    stopEditingUser() {
        this.setState({
            editingUser: null
        });
    }

    deleteUser(user: User) {
        if (confirm('Delete ' + user.fullName + '. Are you sure?'))
            this.props.deleteUser(user.name);
    }

    userIsCurrentUser(user: User): boolean {
        return this.props.currentUser.name == user.name;
    }

    saveUserEdit(user: User) {
        this.props.updateUser(user);
        this.setState({
            editingUser: null
        });
    }

    displayRoles(roles: UserRole[]): string {
        return roles.join(', ');
    }

    renderUsersTable(): any {
        if (this.props.isLoading) {
            return <div>Loading users</div>;
        }
        else {
            return <div>
                <!-- snipped -->
             </div>;
        }
    }

    public render() {
        return <div>
            <h1>User Management</h1>
            {this.renderUsersTable()}
        </div>;
    }
}

const mapStateToProps = (state: ApplicationState, ownProps?: UserMgmtState) => ({
    isLoading: state ? state.userManagement.isLoading : false,
    users: state ? state.userManagement.users : [],
    currentUser: state ? state.loggedInUser.currentUser : null
});

export default connect(
    mapStateToProps, // Selects which state properties are merged into the component's props
    UserStore.actionCreators // Selects which action creators are merged into the component's props
)(UserManagement);

为什么要编译UserManagement,而不能编译Toastbar?我真的很迷糊...

1 个答案:

答案 0 :(得分:0)

问题在于state.toastMessages.messages属性的类型为String [],而ToastProps.messages属性的类型为string []

这些类型不同,因此TypeScript不会将mapStateToProps方法的结果与ToastProps接口具有相同的类型。

万一其他人遇到类似的问题并想知道如何解决:为了解决这个问题,我将单行mapStateToProps方法更改为定义并返回结果的多行方法,然后出现了编译问题那里。一旦我知道mapStateToProps的输出具有不兼容的类型,我便检查了state.toastMessages.messages的类型并发现了问题