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

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

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

ESLintは、JavaScriptのための構文チェックツール。全検証ルールを自由に on/offでき、独自のプロジェクトに合わせたカスタムルールを容易に設定することが可能。公開されている様々なプラグインを組み込んで使用することもできます。

TypeScript

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

React.js

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

Q&A

解決済

1回答

4436閲覧

'value' is already declared in the upper scope @typescript-eslint/no-shadow

aiai8976

総合スコア112

ESLint

ESLintは、JavaScriptのための構文チェックツール。全検証ルールを自由に on/offでき、独自のプロジェクトに合わせたカスタムルールを容易に設定することが可能。公開されている様々なプラグインを組み込んで使用することもできます。

TypeScript

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

React.js

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

0グッド

0クリップ

投稿2021/05/31 07:52

編集2021/06/01 01:25

前提・実現したいこと

react-autosuggetionsを導入したいと思っています。
自分の環境はtypescriptなので書き換えたものを利用したいのですが、
以下のようなエラーが出て困っています。
valueの変数名を変えるとそのようなtypeはないと言われるので、ルールをoffにしようかなと思い、
調べてみたところ、.eslintrc.jsにルールを追加すればいけるらしいのですが、うまくいきませんでした。
わかる方がいましたら、コメントお願いします。

####参考
https://codesandbox.io/s/zx4ht?file=/src/index.tsx:0-1517

発生している問題・エラーメッセージ

'value' is already declared in the upper scope @typescript-eslint/no-shadow

該当のソースコード

import React from "react"; import { useState } from "react"; import ReactDOM from "react-dom"; import AutoSuggest from "react-autosuggest"; import "./styles.css"; const companies: string[] = [ "Company1", "Company2", "Big Corp", "Happy Toy Company" ]; const lowerCasedCompanies = companies.map(language => language.toLowerCase()); const App: React.FC = () => { const [value, setValue] = useState(""); const [suggestions, setSuggestions] = useState<string[]>([]); function getSuggestions(value: string): string[] { return lowerCasedCompanies.filter(language => language.startsWith(value.trim().toLowerCase()) ); } return ( <div> <AutoSuggest suggestions={suggestions} onSuggestionsClearRequested={() => setSuggestions([])} onSuggestionsFetchRequested={({ value }) => { setValue(value); setSuggestions(getSuggestions(value)); }} onSuggestionSelected={(_, { suggestionValue }) => console.log("Selected: " + suggestionValue) } getSuggestionValue={suggestion => suggestion} renderSuggestion={suggestion => <span>{suggestion}</span>} inputProps={{ placeholder: "Type 'c'", value: value, onChange: (_, { newValue, method }) => { setValue(newValue); } }} highlightFirstSuggestion={true} /> </div> ); }; const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement);

試したこと

.eslintrc.js

js

1module.exports = { 2 env: { 3 browser: true, 4 es2021: true, 5 }, 6 extends: [ 7 'plugin:react/recommended', 8 'airbnb', 9 'plugin:@typescript-eslint/recommended', 10 'plugin:prettier/recommended', 11 ], 12 globals: { 13 Atomics: 'readonly', 14 SharedArrayBuffer: 'readonly', 15 }, 16 parser: '@typescript-eslint/parser', 17 parserOptions: { 18 ecmaFeatures: { 19 jsx: true, 20 }, 21 ecmaVersion: 12, 22 sourceType: 'module', 23 }, 24 settings: { 25 'import/resolver': { 26 node: { 27 extensions: ['.js', '.jsx', '.ts', '.tsx'], 28 }, 29 }, 30 }, 31 plugins: ['react', '@typescript-eslint'], 32 rules: { 33 '@typescript-eslint/indent': ['error', 2], 34 '@typescript-eslint/prefer-interface': 'off', 35 'react/jsx-filename-extension': ['error', { extensions: ['.jsx', '.tsx'] }], 36 'react/prop-types': 'off', 37 'spaced-comment': ['error', 'always', { markers: ['/ <reference'] }], 38 'no-use-before-define': 'off', 39 '@typescript-eslint/no-use-before-define': ['error', { variables: false }], 40 'import/extensions': [ 41 'error', 42 'ignorePackages', 43 { 44 js: 'never', 45 jsx: 'never', 46 ts: 'never', 47 tsx: 'never', 48 }, 49 ], 50 'prettier/prettier': [ 51 'warn', 52 { 53 singleQuote: true, 54 semi: false, 55 }, 56 ], 57 //追加した箇所 58 // 'overrides': [ 59 // { 60 // 'rules': { // Here it worked 61 // '@typescript-eslint/no-shadow': ['error'], 62 // 'no-shadow': 'off', 63 // } 64 // } 65 // ] 66 //'no-shadow': 'off', 67 //'@typescript-eslint/no-shadow': ['error'], 68 }, 69} 70

###コメントに対して

package.json

{ "name": "catwiki_front", "version": "0.1.0", "private": true, "dependencies": { "@chakra-ui/icons": "^1.0.13", "@chakra-ui/react": "^1.6.0", "@emotion/react": "^11.1.5", "@emotion/styled": "^11.3.0", "@testing-library/jest-dom": "^5.12.0", "@testing-library/react": "^11.2.6", "@testing-library/user-event": "^12.8.3", "@types/jest": "^26.0.23", "@types/node": "^12.20.10", "@types/react": "^17.0.4", "@types/react-autosuggest": "^10.1.4", "@types/react-dom": "^17.0.3", "@types/react-router-dom": "^5.1.7", "framer-motion": "^4.1.11", "react": "^17.0.2", "react-autosuggest": "^10.1.0", "react-dom": "^17.0.2", "react-masonry-css": "^1.0.16", "react-router-dom": "^5.2.0", "react-scripts": "4.0.3", "typescript": "^4.2.4", "web-vitals": "^1.1.1" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": [ "react-app", "react-app/jest" ] }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^4.22.0", "@typescript-eslint/parser": "^4.22.0", "eslint": "^7.25.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-react": "^7.23.2", "eslint-plugin-react-hooks": "^4.2.0", "prettier": "^2.2.1" } }

例えばvalueをvalue_にすると以下のようにエラーが出力されます。
SuggestionsFetchRequestedParamsを自分で定義していない(@type/react-autosuggestで定義している?)ので、どのように対応したらいいのかわかりません。

プロパティ 'value_' は型 'SuggestionsFetchRequestedParams' に存在しません。

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

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

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

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

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

hoshi-takanori

2021/05/31 18:26

package.json がないのでよく分かりませんが、こちらでは 'no-shadow': 'off' でうまくいきますけど。 (でも、そんなことせずに変数名を解決すべきという気も…。)
aiai8976

2021/06/01 01:26

なぜか自分の環境ではうまくいきません、、 いくつか指摘について追加したので確認いただけると幸いです。
guest

回答1

0

ベストアンサー

package.json ありがとうございます。そのまま yarn start したら、次のエラーが出ました。
(@typescript-eslint/no-shadow じゃなくて単なる no-shadow なんですよね…。)

src/index.tsx Line 1:19: '/Users/hoshi/work/react-app-ts/node_modules/react/index.js' imported multiple times import/no-duplicates Line 2:26: '/Users/hoshi/work/react-app-ts/node_modules/react/index.js' imported multiple times import/no-duplicates Line 21:27: 'value' is already declared in the upper scope no-shadow Line 31:41: 'value' is already declared in the upper scope no-shadow Line 36:23: Unexpected string concatenation prefer-template Line 42:11: Expected property shorthand object-shorthand Line 47:9: Value must be omitted for boolean attributes react/jsx-boolean-value

no-shadow を出さなくする方法としては、次の 3 通りの方法が考えられます。

  1. .eslintrc.js の 'no-shadow': 'off', のコメントを外す (こちらではこれでうまくいきました)
  2. index.tsx に /* eslint-disable no-shadow / (または / eslint-disable @typescript-eslint/no-shadow */) と書く (参考: ESLintのコメントでのルール制御 - Qiita)
  3. 変数名を変える

ここで、onSuggestionsFetchRequested で使ってる変数というか引数は、

TypeScript

1 onSuggestionsFetchRequested={({ value }) => { 2 setValue(value); 3 setSuggestions(getSuggestions(value)); 4 }}

分割代入で受け取ってるので、変えるわけにはいきません。ので、分割代入をやめるか、useState してる方を変える必要があります。

diff

1- const [value, setValue] = useState(""); 2+ const [value_, setValue] = useState(""); 3 4 // 略 5 6 inputProps={{ 7 placeholder: "Type 'c'", 8- value: value, 9+ value: value_, 10 onChange: (_, { newValue, method }) => { 11 setValue(newValue); 12 } 13 }}

投稿2021/06/01 02:14

編集2021/06/01 02:16
hoshi-takanori

総合スコア7895

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

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

aiai8976

2021/06/02 01:39

useStateの変数名を変えるとエラーが出たのですが、分割代入をやめてpropsとして受け取るとうまくいけました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問