javascript - objektet är möjligen 'null' i typescript
interface IRoleAddProps {
roles: Array<IRole>
}
interface IRoleAddState {
current: IRole | null
}
class RoleAdd extends React.Component<IRoleAddProps, IRoleAddState> {
state = {
current: null,
}
renderNoneSelect = () => {
return (
<div styleName="empty">
<SvgIcon name="arrow" styleName="icon-arrow" />
<span>Empty</span>
</div>
)
}
onRoleClick = (role: IRole) => {
this.setState({
current: role,
})
}
render() {
const { roles } = this.props
const current = this.state.current
return (
<div styleName="role-add">
<div styleName="role-list">
<div styleName="title">Select role:</div>
<div styleName="list">
{roles.map(role => {
const cls = classNames({
item: true,
active: current && ( current.id === role.id )
})
return (
<div
key={role.id}
styleName={cls}
className="g-text-inline"
onClick={this.onRoleClick.bind(this, role)}
>
<CheckBox />
<span>{role.name}</span>
</div>
)
})}
</div>
</div>
<div styleName="view">
{!current && this.renderNoneSelect()}
{current && 'view'}
</div>
</div>
)
}
}
export default RoleAddKoden är sådan här, men TS säger fortfarande till mig:
Till och med jag försökte:
Och "!" fungerar inte heller
Som du kan se kan inte objektet "current" vara null eftersom jag har en nullkontroll innan jag använder det.
Men TypeScript-motorn visar fortfarande det felet för mig.
Jag undrar om det är för att jag initialiserade det aktuella objektet med värdet null, men TS kan inte lista ut typerna från setState, så det tar alltid current som null?
Svar #1
Du behöver tilldela en typ till state, som
state: IRoleAddState = {
current: null
};
Då kommer state att vara av typen IRoleAddState och inte { current: null }. Efter det kommer de metoder du försökte använda att fungera.
Svar #2
Att explicit definiera tillståndet i en konstruktor bör lösa problemet.
constructor(props) {
super(props);
this.state = {
current: null;
}
}


