我有一个不会编译的打字稿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?我真的很迷糊...
答案 0 :(得分:0)
问题在于state.toastMessages.messages属性的类型为String [],而ToastProps.messages属性的类型为string []
这些类型不同,因此TypeScript不会将mapStateToProps方法的结果与ToastProps接口具有相同的类型。
万一其他人遇到类似的问题并想知道如何解决:为了解决这个问题,我将单行mapStateToProps方法更改为定义并返回结果的多行方法,然后出现了编译问题那里。一旦我知道mapStateToProps的输出具有不兼容的类型,我便检查了state.toastMessages.messages的类型并发现了问题