前提・実現したいこと
React+Redux+TypeScriptでtodo一覧画面を作成中なのですが、下記のエラーメッセージの通り、データが受け取れません。component/task.tsxというファイルでReduxの状態管理をしているのですが、エラーメッセージが表示されているのは親コンポーネントのcomponent/main.tsxのimortしている<Task />の部分で表示されています。
この場合、型の定義等でどこかずれてしまっているか、またはdispatchするところの記述がずれてしまっているか、という仮説を立て、修正してみたのですが、一向に解決できませんでした。。
どなたか、お力添えいただけると大変助かります!
発生している問題・エラーメッセージ
プロパティ 'data' は型 '{}' にありませんが、 型 'Pick<ClassAttributes<Task> & getList, "ref" | "data" | "key">' では必須です。
該当のソースコード
component/task.tsx
TypeScript
1import React, { Component } from "react"; 2import { Button, ButtonGroup, Breadcrumb, Row, Col } from "react-bootstrap"; 3import { Link } from "react-router-dom"; 4import { connect } from "react-redux"; 5import { Dispatch } from "redux"; 6import { readEvents } from "../actions"; 7import { ReduxAction } from "../store"; 8import { State } from "../reducer/events"; 9interface getList { 10 data: { 11 taskId: number; 12 title: string; 13 description: string; 14 status: string; 15 createTime: string; 16 updateTime: string; 17 tag?: string; 18 }[] 19} 20class Task extends React.Component<getList,{}> { 21 render() { 22 return ( 23 <div> 24 <Row className="justify-content-md-center"> 25 <Col xs lg="2"> 26 <Breadcrumb> 27 <ButtonGroup vertical> 28 <Button variant="outline-warning"> 29 <Link to="/task/:id">編集</Link> 30 </Button>{" "} 31 <Button variant="outline-warning"> 32 <Link to="/task/:id">削除</Link> 33 </Button>{" "} 34 </ButtonGroup> 35 </Breadcrumb> 36 </Col> 37 <Col>{this.props.data.title}</Col> 38 <Col>{this.props.data.description}</Col> 39 </Row> 40 </div> 41 ); 42 } 43} 44 45// const mapStateToProps = (state: getList) => { 46// return { 47// value: state.data 48// }; 49// }; 50// const mapDispatchToProps = (dispatch: Dispatch) => { 51// readEvents(); 52// }; 53// export default connect(mapStateToProps, mapDispatchToProps)(Task) 54export class ActionDispatcher { 55 // constructor(private dispatch: (action: ReduxAction) => void) {} 56 constructor(private dispatch: Dispatch<ReduxAction>) {} 57 58 public list() { 59 this.dispatch(readEvents()); 60 } 61} 62export default connect( 63 (state:getList) => ({ value: state.data }), 64 (dispatch: Dispatch<ReduxAction>) => ({ 65 actions: new ActionDispatcher(dispatch), 66 }) 67)(Task);
Action/index.tsx
TypeScript
1import axios from "axios"; 2import { stub } from "./test-stub"; 3import { Action } from "redux"; 4 5// const ROOT_URL = "http://localhost:3000" 6 7//typeの種類 8export const Type = { 9 read: "READ", 10 create: "CREATE", 11 update: "UPDATE", 12 delete: "DELETE", 13} as const; 14 15export type Type = typeof Type[keyof typeof Type]; 16 17//actionの型 18export interface getAction extends Action { 19 type: string, 20 data: { 21 taskId: number; 22 title: string; 23 description: string; 24 status: string; 25 createTime: string; 26 updateTime: string; 27 tag?: string[]; 28 }[]; 29} 30 31 32export const readEvents = (): getAction => ({ 33 type: Type.read, 34 data: stub, 35}); 36 37export type todoActions = getAction
Reducer/events.tsx
TypeScript
1import { todoActions, Type } from "../actions/index"; 2export interface State { 3 type?: string; 4 data: { 5 taskId: number; 6 title: string; 7 description: string; 8 status: string; 9 createTime: string; 10 updateTime: string; 11 tag?: string[]; 12 }[]; 13} 14 15export const initialState: State = { 16 data: [ 17 { 18 taskId: 0, 19 title: "", 20 description: "", 21 status: "", 22 createTime: "", 23 updateTime: "", 24 tag: [], 25 }, 26 ], 27}; 28 29export default function reducer( 30 state: State = initialState, 31 action: todoActions 32) { 33 switch (action.type) { 34 case Type.read: 35 // return Object.assign({}, state, action.data); 36 return {...state,data:action} 37 default: 38 return state; 39 } 40} 41
Reducer/index.tsx
TypeScript
1import { combineReducers } from "redux"; 2import reducer from "./events"; 3import { getAction } from "../actions/index" 4 5export type ReduxState = { 6 reducer: getAction 7} 8 9export default combineReducers({ reducer }); 10
Store/store.tsx
TypeScript
1import { createStore, applyMiddleware } from "redux" 2import reducer from "./reducer" 3import thunk from "redux-thunk"; 4import { Action } from "redux"; 5import { todoActions } from "./actions"; 6 7export const store = createStore(reducer, applyMiddleware(thunk)); 8 9 10export type ReduxAction = todoActions | Action
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。