質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

543閲覧

TypeScript + Reactでの配列操作について

nakapon9517

総合スコア3

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/05/22 04:35

編集2020/05/22 04:44

#現象
re-ducks-study

上記参考ソースと同じコーティング方法で実装を行っているのですが
エラーが出力され、処理が実行できません。。

#やったこと
・map,filter,foreachで確認
・データ型をFoldではなく、id name ...などに変更して処理
・直書きで動作できるのは確認OK

#エラー内容

TypeError: folders.map is not a function

SideBar
C:/work/10_dev/react/learn-speak/src/views/components/SideBar.tsx:73
70 | {/* {open ? <ExpandLess /> : <ExpandMore />} */}
71 | </ListItem>
72 | <Collapse in={true} timeout="auto" unmountOnExit>
73 | <List component="div" disablePadding>
74 |^ {folders.map((folder) => (
75 | <FolderItem key={folder.id} folder={folder} />
76 | ))}

###sidebar.tsx(エラーとなっているファイル)

TypeScript

1import React, { FC } from "react"; 2import { Fold } from "speak"; 3// import { makeStyles, Theme, createStyles } from "@material-ui/core/styles"; 4import { withStyles, WithStyles, StyleRules } from "@material-ui/core/styles"; 5import List from "@material-ui/core/List"; 6import ListItem from "@material-ui/core/ListItem"; 7import ListItemIcon from "@material-ui/core/ListItemIcon"; 8import ListItemText from "@material-ui/core/ListItemText"; 9import Collapse from "@material-ui/core/Collapse"; 10import InboxIcon from "@material-ui/icons/MoveToInbox"; 11import DraftsIcon from "@material-ui/icons/Drafts"; 12import SendIcon from "@material-ui/icons/Send"; 13// import ExpandLess from "@material-ui/icons/ExpandLess"; 14// import ExpandMore from "@material-ui/icons/ExpandMore"; 15import Folder from "@material-ui/icons/Folder"; 16 17const styles = (): StyleRules => ({ 18 root: { 19 maxWidth: 360, 20 // backgroundColor: theme.palette.background.paper, 21 display: "block", 22 }, 23}); 24 25type FolderProps = { 26 folder: Fold; 27}; 28 29const FolderItem: FC<FolderProps> = ({ 30 folder: { id, name, text, opened, file }, 31}) => ( 32 <ListItem button key={id}> 33 <ListItemIcon> 34 <Folder /> 35 {id} 36 </ListItemIcon> 37 <ListItemText primary={name} /> 38 </ListItem> 39); 40 41type Props = WithStyles<typeof styles> & { 42 folders: Fold[]; 43}; 44 45const SideBar: FC<Props> = ({ classes, folders }) => ( 46 <div> 47 <List 48 component="nav" 49 aria-labelledby="nested-list-subheader" 50 className={classes.root} 51 > 52 <ListItem button> 53 <ListItemIcon> 54 <SendIcon /> 55 </ListItemIcon> 56 <ListItemText primary="Sent mail" /> 57 </ListItem> 58 <ListItem button> 59 <ListItemIcon> 60 <DraftsIcon /> 61 </ListItemIcon> 62 <ListItemText primary="Drafts" /> 63 </ListItem> 64 <ListItem button> 65 {/* <ListItem button onClick={handleClick}> */} 66 <ListItemIcon> 67 <InboxIcon /> 68 </ListItemIcon> 69 <ListItemText primary="Inbox" /> 70 {/* {open ? <ExpandLess /> : <ExpandMore />} */} 71 </ListItem> 72 <Collapse in={true} timeout="auto" unmountOnExit> 73 <List component="div" disablePadding> 74 {folders.map((folder) => (             ←ここでエラー 75 <FolderItem key={folder.id} folder={folder} /> 76 ))} 77 </List> 78 </Collapse> 79 </List> 80 </div> 81); 82 83// export default SideBar; 84 85export default withStyles(styles)(SideBar); 86

###speak.d.ts(データ型)

TypeScript

1declare module "speak" { 2 export interface Fold { 3 id: string; 4 name: string; 5 text: string; 6 opened: boolean; 7 file: File; 8 } 9 export interface File { 10 id: string; 11 name: string; 12 text: string; 13 listening: boolean; 14 } 15}

###package.json

json

1{ 2 "name": "learn-speak", 3 "version": "0.1.0", 4 "private": true, 5 "dependencies": { 6 "@material-ui/core": "^4.9.14", 7 "@material-ui/icons": "^4.9.1", 8 "@reduxjs/toolkit": "^1.3.6", 9 "@testing-library/jest-dom": "^4.2.4", 10 "@testing-library/react": "^9.5.0", 11 "@testing-library/user-event": "^7.2.1", 12 "@types/jest": "^24.9.1", 13 "@types/node": "^12.12.41", 14 "@types/react": "^16.9.35", 15 "@types/react-dom": "^16.9.8", 16 "@types/react-redux": "^7.1.9", 17 "@types/react-scroll": "^1.5.5", 18 "@types/redux-actions": "^2.6.1", 19 "cuid": "^2.1.8", 20 "react": "^16.13.1", 21 "react-dom": "^16.13.1", 22 "react-redux": "^7.2.0", 23 "react-scripts": "3.4.1", 24 "react-scroll": "^1.7.16", 25 "redux-actions-type": "^1.0.0", 26 "typescript": "^3.7.5" 27 }, 28 "scripts": { 29 "start": "react-scripts start", 30 "build": "react-scripts build", 31 "test": "react-scripts test", 32 "eject": "react-scripts eject" 33 }, 34 "eslintConfig": { 35 "extends": "react-app" 36 }, 37 "browserslist": { 38 "production": [ 39 ">0.2%", 40 "not dead", 41 "not op_mini all" 42 ], 43 "development": [ 44 "last 1 chrome version", 45 "last 1 firefox version", 46 "last 1 safari version" 47 ] 48 } 49}

##以下追記
###App.tsx

import React from "react"; import "./App.css"; import Speak from "./containers/Speak"; const App: React.FC = () => { return ( <React.Fragment> <Speak /> </React.Fragment> ); }; export default App;

###Speak.tsx

import React, { FC } from "react"; import { Fold } from "speak"; // import { makeStyles, Theme, createStyles } from "@material-ui/core/styles"; import { withStyles, WithStyles, StyleRules } from "@material-ui/core/styles"; import Paper from "@material-ui/core/Paper"; import Header from "../components/Header"; import SideBar from "../components/SideBar"; import Body from "../components/Body"; import Footer from "../components/Footer"; const styles = (): StyleRules => ({ flex: { // backgroundColor: theme.palette.background.paper, display: "flex", }, sidebar: { width: "30%", border: "0.8px solid gray", margin: "5px", }, body: { width: "100%", margin: "5px 5px 5px 0px", border: "0.8px solid gray", }, foot: { height: "10px", textAlign: "right", margin: "10px", }, }); type Props = WithStyles<typeof styles> & { folders: Fold[]; folderAdd: () => void; folderDel: () => void; fileAdd: () => void; fileDel: () => void; musicStart: () => void; musicStop: () => void; musicEnd: () => void; }; const Speak: FC<Props> = ({ classes, folderAdd, folderDel, fileAdd, fileDel, musicStart, musicStop, musicEnd, folders, }) => { return ( <div> <Header /> <div className={classes.flex}> <Paper className={classes.sidebar}> <SideBar folders={folders} /> </Paper> <Paper className={classes.body}> <Body /> </Paper> </div> <div className={classes.foot}> <Footer /> </div> </div> ); }; export default withStyles(styles)(Speak);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/05/22 04:39

Sidebarはどのようにマウントしていますか?
nakapon9517

2020/05/22 04:45

ご質問ありがとうございます。追記いたしました。 質問への回答になっているか不安ですが、、、 ComponentDidMountなどは理解できていないので未記載です。
guest

回答1

0

ベストアンサー

正しい値を渡していないだけと思われます。

<App>内で<Speak />としているので、この<Speak>に渡されるpropはありません。結果、foldersundefinedとなって、それが<SideBar folders={folders} />として渡されるので、そのままundefinedが来ます。もちろんmapはできません。

投稿2020/05/22 04:49

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問