Я пытаюсь использовать response-redux с машинописным шрифтом, и я получаю ошибку типа, когда пытаюсь вставить реквизиты с помощью connect() и mapStateToProps.Тип Ошибка при использовании TypScript с React-Redux
Мой компонент выглядит следующим образом:
function mapStateToProps(state) {
return {
counter: state.counter
};
}
function mapDispatchToProps(dispatch) {
return {
incr:() => {
dispatch({type: 'INCR', by: 2});
},
decr:() => {
dispatch({type: 'INCR', by: -1});
}
};
}
export default class Counter extends React.Component<HelloProps, any> {
render() {
return (
<div>
<p>
<label>Counter: </label>
<b>#{this.props.counter}</b>
</p>
<button onClick={e => this.props.incr() }>INCREMENT</button>
<span style={{ padding: "0 5px" }}/>
<button onClick={e => this.props.decr() }>DECREMENT</button>
);
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Counter);
магазин выглядит следующим образом
let store = createStore(
(state:HelloState, action:HelloAction) => {
switch (action.type) {
case 'INCR':
return {counter: state.counter + action.by};
default:
return state;
}
},
Наконец, я определил мои типы быть:
interface HelloProps {
counter?: number;
incr?:() => any;
decr?:() => any;
}
interface HelloState {
counter:number;
}
interface HelloAction {
type:string,
by:number;
}
Когда я пытаюсь скомпилируйте код. Я получаю следующую ошибку:
(39,61): error TS2345: Argument of type 'typeof Counter' is not assignable to parameter of type 'ComponentClass<{ counter: any; } & { incr:() => void; decr:() => void; }> | StatelessComponent<...'.
Type 'typeof Counter' is not assignable to type 'StatelessComponent<{ counter: any; } & { incr:() => void; decr:() => void; }>'.
Type 'typeof Counter' provides no match for the signature '(props?: { counter: any; } & { incr:() => void; decr:() => void; }, context?: any): ReactElement<any>'
Интересно, что код все еще работает, даже если он выдает ошибку типа. Кроме того, изменение интерфейса prop компонента для любого решения также решает проблему. Кажется, что система типов не понимает, что эти два объекта объединены двумя отображаемыми функциями.
Вы узнали что-нибудь еще (объяснение) об этом? Я заметил, что вы не получили ответа на свой вопрос по проблеме github. Используете ли вы типы возвращаемых данных для mapStateToProps и mapDispatchToProps (для чего вам, вероятно, пришлось сделать члены интерфейса опционными, как вы предполагали)? Именно так я в настоящее время применяю его, чтобы иметь возможность запускать. – Jeroen
Да, я указал типы возврата на mapStateToProps и mapDispatchToProps. Элементы интерфейса должны быть факультативными, независимо от того, в противном случае он не будет работать, когда компонент вызывается. Я не большой поклонник того, как TS работает с методом подключения Redux и connect-redux, но сейчас я не могу придумать хороший способ. – Ochowie