実現したいこと
Reactで、配列を受け取り、それをmap関数で処理しJSXを返す関数を実装したい。
仮引数は分割代入で宣言し、stringを持つ配列、あるいはnumberを持つ配列どちらかであると定義したい。
発生している問題・分からないこと
分割代入を行い型定義をしたはずが、仮引数の型がany型となる。関数本体で引数を呼び出しても見つからないとエラーが出る。
エラーメッセージ
error
1[{ 2 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 3 "owner": "typescript", 4 "code": "7010", 5 "severity": 8, 6 "message": "'Test' には戻り値の型の注釈がないため、戻り値の型は暗黙的に 'any' になります。", 7 "source": "ts", 8 "startLineNumber": 1, 9 "startColumn": 25, 10 "endLineNumber": 1, 11 "endColumn": 29 12},{ 13 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 14 "owner": "typescript", 15 "code": "2842", 16 "severity": 8, 17 "message": "'(Missing)' は、'props' の未使用の名前変更です。型の注釈として使用するつもりでしたか?", 18 "source": "ts", 19 "startLineNumber": 2, 20 "startColumn": 11, 21 "endLineNumber": 2, 22 "endColumn": 11, 23 "relatedInformation": [ 24 { 25 "startLineNumber": 2, 26 "startColumn": 11, 27 "endLineNumber": 2, 28 "endColumn": 12, 29 "message": "ここにパラメーター全体の型を追加することによってのみ、'props' の型を書き込むことができます。", 30 "resource": "/d:/dev/runnersheet/src/app/Test.tsx" 31 } 32 ] 33},{ 34 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 35 "owner": "typescript", 36 "code": "7031", 37 "severity": 8, 38 "message": "バインド要素 '(Missing)' には暗黙的に 'any' 型が含まれます。", 39 "source": "ts", 40 "startLineNumber": 2, 41 "startColumn": 11, 42 "endLineNumber": 2, 43 "endColumn": 11 44},{ 45 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 46 "owner": "typescript", 47 "code": "1003", 48 "severity": 8, 49 "message": "識別子が必要です。", 50 "source": "ts", 51 "startLineNumber": 2, 52 "startColumn": 12, 53 "endLineNumber": 2, 54 "endColumn": 13 55},{ 56 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 57 "owner": "typescript", 58 "code": "7053", 59 "severity": 8, 60 "message": "型 'any' の式を使用して型 'Number' にインデックスを付けることはできないため、要素は暗黙的に 'any' 型になります。", 61 "source": "ts", 62 "startLineNumber": 2, 63 "startColumn": 12, 64 "endLineNumber": 2, 65 "endColumn": 31 66},{ 67 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 68 "owner": "typescript", 69 "code": "2693", 70 "severity": 8, 71 "message": "'string' は型のみを参照しますが、ここで値として使用されています。", 72 "source": "ts", 73 "startLineNumber": 2, 74 "startColumn": 13, 75 "endLineNumber": 2, 76 "endColumn": 19 77},{ 78 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 79 "owner": "typescript", 80 "code": "2693", 81 "severity": 8, 82 "message": "'number' は型のみを参照しますが、ここで値として使用されています。", 83 "source": "ts", 84 "startLineNumber": 2, 85 "startColumn": 22, 86 "endLineNumber": 2, 87 "endColumn": 28 88},{ 89 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 90 "owner": "typescript", 91 "code": "1011", 92 "severity": 8, 93 "message": "要素アクセス式では、引数を取る必要があります。", 94 "source": "ts", 95 "startLineNumber": 2, 96 "startColumn": 30, 97 "endLineNumber": 2, 98 "endColumn": 30 99},{ 100 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 101 "owner": "typescript", 102 "code": "1128", 103 "severity": 8, 104 "message": "宣言またはステートメントが必要です。", 105 "source": "ts", 106 "startLineNumber": 3, 107 "startColumn": 1, 108 "endLineNumber": 3, 109 "endColumn": 2 110},{ 111 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 112 "owner": "typescript", 113 "code": "1128", 114 "severity": 8, 115 "message": "宣言またはステートメントが必要です。", 116 "source": "ts", 117 "startLineNumber": 3, 118 "startColumn": 2, 119 "endLineNumber": 3, 120 "endColumn": 3 121},{ 122 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 123 "owner": "typescript", 124 "code": "2304", 125 "severity": 8, 126 "message": "名前 'props' が見つかりません。", 127 "source": "ts", 128 "startLineNumber": 4, 129 "startColumn": 5, 130 "endLineNumber": 4, 131 "endColumn": 10 132},{ 133 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 134 "owner": "typescript", 135 "code": "7006", 136 "severity": 8, 137 "message": "パラメーター 'data' の型は暗黙的に 'any' になります。", 138 "source": "ts", 139 "startLineNumber": 4, 140 "startColumn": 16, 141 "endLineNumber": 4, 142 "endColumn": 20 143},{ 144 "resource": "/d:/dev/runnersheet/src/app/Test.tsx", 145 "owner": "typescript", 146 "code": "7006", 147 "severity": 8, 148 "message": "パラメーター 'i' の型は暗黙的に 'any' になります。", 149 "source": "ts", 150 "startLineNumber": 4, 151 "startColumn": 22, 152 "endLineNumber": 4, 153 "endColumn": 23 154}]
該当のソースコード
TypeScript
1export default function Test({ 2 props: (string | number)[] 3}) { 4 props.map((data, i) => (data)); 5} 6// propsの型がany型となる
TypeScript
1export default function Test( 2 children: { props: (string | number)[] } 3) { 4 const { props } = children; 5 props.map((data, i) => (data)); 6} 7// ちゃんと型定義も反映されているが、いちいちchildrenの宣言をするのは手間なので避けたい
TypeScript
1type TestProps = (string | number)[]; 2 3export default function Test({ 4 props: TestProps 5}) { 6 props.map((data, i) => (data)); 7} 8// 先に型定義したらどうかと思ったらそもそもpropsが見つからないようだ。
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
create-next-appコマンドで作ったフォルダだが、以前のエラーの際に「npm i」で再インストールしたら直った経緯があった、今回も試したがエラー改善にはならなかった。
補足
インストールされているパッケージ
├── @types/node@20.12.12
├── @types/react-dom@18.3.0
├── @types/react@18.3.2
├── eslint-config-next@14.2.3
なお不具合が発生する前にvscodeのショートカットを試しに使っており、それが悪さをしているのかとも考えた。新しいファイルを作成(ctrl+win+alt+N)を誤ってctrl+shit+alt+Nなどと入力していた。関係はないと思うが念のため。
フォルダを完全に削除しcreate-next-appで再度フォルダを作成しなおす、vscodeをアンインストールし再インストールするなどしてもだめだった。
├── eslint@8.57.0
├── next@14.2.3
├── react-dom@18.3.1
├── react@18.3.1
└── typescript@5.4.5

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。