ReduxとTypeScriptは初めてです。
私は react-redux docs で私がやろうとしていることのかなり良い基本的な削減バージョンを見つけました。
コードは次のとおりです。
import * as actionCreators from '../actions/index'
import { bindActionCreators } from 'redux'
import React, { Component } from 'react'
import { connect } from 'react-redux'
class TodoApp extends Component {
render() {
return (<div>test!</div>)
}
}
function mapStateToProps(state) {
return { todos: state.todos }
}
function mapDispatchToProps(dispatch) {
return { actions: bindActionCreators(actionCreators, dispatch) }
}
export default connect(mapStateToProps, mapDispatchToProps)(TodoApp)
私のコードエディター(TSLint拡張子の付いたVSコード)とtsc
はどちらも、最後の(TodoApp)
をエラーとして強調表示します。これは私が取得するメッセージです。
src/components/test.tsx(20,61):エラーTS2345:タイプ 'typeof TodoApp'の引数は、タイプ 'ComponentType <{todos:any;のパラメーターに割り当てることができません。 }&{アクション:typeof "(filepath)... '。タイプ' typeof TodoApp 'は、タイプ' StatelessComponent <{todos:any;}&{アクション:typeof"(filepath)... 'に割り当てられません。タイプ 'typeof TodoApp'は、シグネチャ '(props:{todos:any;}&{actions:typeof "(filepath)/ actions/index";}&{children ?: ReactNode;}、context ?: any ):ReactElement |ヌル'。
20エクスポートデフォルトのconnect(mapStateToProps、mapDispatchToProps)(TodoApp)
私の問題は、mapStateToProps
とconnect
が何をしているかを完全には理解していないことですが、理解する前に、
このTypeScriptの「エラー」を修正するために、ここでコードを変更できるかどうか知りたいです。
あなたの反応コンポーネントは小道具を期待しないので、connect
とmapStateToProps
は両方とも空のオブジェクトを返すはずであると推論するため、mapDispatchToProps
にはエラーがあります
これを回避するには、reactプロップの型定義を追加しますが、暗黙のany
の安全でない使用法もたくさんあります。安全のためにこのアプリケーションを完全に入力すると、次のようになります。
interface ITodo {
description: string
}
interface ITodosState {
todos: ITodo[]
}
interface ITodoProps {
todos: ITodo[]
}
interface ITodoActionProps {
someAction: () => void
}
class TodoApp extends React.Component<ITodoProps & ITodoActionProps> {
render() {
return (<div>test!</div>)
}
}
function mapStateToProps(state: ITodosState): ITodoProps {
return { todos: state.todos }
}
function mapDispatchToProps(dispatch: Dispatch<ITodosState>): ITodoActionProps {
return bindActionCreators({ someAction: actionCreators.someAction }, dispatch)
}
export default connect<ITodoProps, ITodoActionProps, {}>(mapStateToProps, mapDispatchToProps)(TodoApp)
TodoApp
の小道具を入力していません。
type Props = {
todos: any[] // What ever the type of state.todos is
actions: {
addTodo: Dispatch<any>
}
}
class TodoApp extends React.Component<Props> {
render() {
return <div>test!</div>
}
}