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

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

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

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

TypeScript

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

React.js

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

Q&A

0回答

1828閲覧

エラー "Parameter 'data' implicitly has an 'any' type.'." が出力されてしまう

07290729

総合スコア15

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

TypeScript

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

React.js

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

0グッド

0クリップ

投稿2020/08/03 10:58

編集2020/08/06 11:01

react + redux (with toolkit) + typescript で
{
Name: string
Address: string
}
のようなhash を配列としてもたせたデータをUI上から入力、出力するような
画面を作成中ですが、以下のエラーでうまく動かない状態です。。。

TypeScript error in App.tsx(13,21): Parameter 'data' implicitly has an 'any' type. TS7006

App.tsx 内の

const onSubmit = (data) => { dispatch(setAddresses(data.addressbook)) }

にて"data" の型が指定されていないことでのエラーというのは
わかっているのですが、本件であればどのように
指定すればよいのかがわからず・・・。
※いくつかの参考文献をもとにこのように書いてしまってます・・・

以下のようなコードですが原因や修正点など
わかる方いらっしゃいましたらご教授ください。。。

  • index.tsx
import React from "react"; import ReactDOM from "react-dom"; import './index.css'; import App from "./App"; import * as serviceWorker from './serviceWorker'; import { Provider } from "react-redux"; import { store } from './store'; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById("root") ); // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. // Learn more about service workers: https://bit.ly/CRA-PWA serviceWorker.unregister();
  • App.tsx
import React from "react" import { useDispatch, useSelector } from "react-redux" import { useForm } from 'react-hook-form' import { setAddresses } from './rootSlice' import { RootState } from './rootReducer' import './common.css' const App = () => { const dispatch = useDispatch(); const addressbook = useSelector((state: RootState) => state.addressbook) const { register, handleSubmit } = useForm(); const onSubmit = (data) => { dispatch(setAddresses(data.addressbook)) } const addAddress = () => { newAddress = { Name: "", Address: "" } addressbook.push(newAddress) dispatch(setAddresses(addressbook)) } return ( <form onSubmit={handleSubmit(onSubmit)}> <div className="div-block"> {addressbook.map((address, index) => { return ( <> <label>Name {index}</label> <input name={`address[${index}].Name`} ref={register} /> <label>Address {index}</label> <input name={`address[${index}].Address`} ref={register} /> </> ) })} <button type="button" onClick={addAddress}>+</button> <button type="submit" className="btn-square-shadow">Apply !</button> </div> <div> <hr></hr> {addressbook.map((address, index) => { return ( <> <div>Name {index}: {address.Name}</div> <div>Name {index}: {address.Address}</div> </> ) })} </div> </form> ); }; export default App;
  • rootSlice.ts
import { createSlice } from '@reduxjs/toolkit' import { AddressBook } from './Types' type State = { addressbook: Addresses[] } const initialState: State = { addressbook: [ { Name: "", Address: "hoge-1-1-1" } ] } const rootSlice = createSlice({ name: 'addressbook', initialState, reducers: { setName: (state, action) => { state.Name = action.payload }, setAddressBook: (state, action) => { state.addressbook = action.payload }, addAddresses: (state, action) => { state.Addresses.push(`address${state.Addresses.length}`) } } }) export const reducer = rootSlice.reducer; export const { setAddresses, addAddresses } = rootSlice.actions
  • store.ts
import { configureStore } from '@reduxjs/toolkit' import { reducer } from './rootSlice' export const store = configureStore({ reducer })
  • rootSlice.ts
type Addresses = { Name: string Address: string } type State = { addressbook: Addresses[] } const initialState: State = { addressbook: [ { Name: "", Address: "hoge-1-1-1" } ] } const rootSlice = createSlice({ name: 'addressbook', initialState, reducers: { setAddressBook: (state, action) => { state.addressbook = action.payload }, addAddresses: (state, action) => { state.addressbook.push({Name: "", Address: ""}) } } }) export const reducer = rootSlice.reducer; export const { setAddressBook, addAddresses } = rootSlice.actions export default rootSlice
  • rootReducer.ts
import { combineReducers } from '@reduxjs/toolkit' import rootSlice from './rootSlice' export const rootReducer = combineReducers({ addressbook: rootSlice.reducer }) export type RootState = ReturnType<typeof rootReducer> export default rootReducer
  • Types.ts
export type Addresses = { Name: string Address: string }
  • tsconfig.json
{ "compilerOptions": { "target": "es5", "lib": [ "dom", "dom.iterable", "esnext" ], "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, "jsx": "react" }, "include": [ "src" ] }

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

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

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

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

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

nekoniki

2020/08/06 07:56

差し支えないようなら`tsconfig.json`も提示いただけると助かります。
07290729

2020/08/06 11:01

nekoniki さん コメントありがとうございます! tsconfig.jsonを追加しましたのでご確認お願いいたしますm
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問