react-redux のconnect
メソッドは4つの Generic Type を受け取れます。例えばconnect
を以下のように使った場合、
mapStateToProps だけの場合
connect(state => state)(class extends React.Component<{foo: string}> {/* ... */})
d.ts
に書かれているこの型が適用されます。
<
TStateProps = {},
no_dispatch = {},
TOwnProps = {},
State = {}
>(
mapStateToProps: MapStateToPropsParam
): InferableComponentEnhancerWithProps;
TStateProps
これは Redux の State からコンポーネントへ props として渡す props の型。つまりstate => state
のように書いた場合 Redux の State と同じものになります。no_dispatch
上記のはmapDispatchToProps
が無いので{}
を渡します。TOwnProps
はラップされるコンポーネントの props を渡します。State
は Redux の State そのままです。
例えば、上記の使い方で State が{hoge: number}
であれば、
connect(state => state)(
class extends React.Component<{foo: string}> {/* ... */}
);
となります。
mapDispatchToProps と一緒の場合
上記のno_dispatch
がTDispatchProps
に変わりました。これはTStateProps
のようにこのconnect
関数の中のmapDispatchToProps
の戻り値の型を指定します。
<
TStateProps = {},
TDispatchProps = {},
TOwnProps = {},
State = {}
>(
mapStateToProps: MapStateToPropsParam,
mapDispatchToProps: MapDispatchToPropsNonObject
): InferableComponentEnhancerWithProps;
例えば以下のようなprops.increment
関数があるコンポーネントがあります。そしてそれはconnect
の第二引数であるmapDispatchToProps
で定義している関数である場合このようになります。connect
からコンポーネントに渡すprops
型もReact.Component
に追加する必要があります。
connect(
state => state,
dispatch => {
return {
increment() {/* ... */}
}
})
(
class extends React.Component<{foo: string} & {increment(): void}> {/* ... */}
);