在 TypeScript React 中,VSCode pretty tier 为导入添加“值”

在 VSCode 中使用插件配置更漂亮之后,在我的 React + TS 代码中,保存函数的格式为每个非默认导入添加了奇怪的 value关键字。

像这样:

import { value ApolloProvider } from '@apollo/client';
import { value BrowserRouter as Router, value Switch } from 'react-router-dom';
import Routes from './routes';
import { value client } from './data/apollo-config';

有了这个 TS 抱怨 Duplicate identifier 'value'.ts(2300)

有人能帮我吗?不知道为什么会这样,也不知道怎么解决。运行 npx prettier --write someFile不会添加 value关键字。

我的包裹:

    "dependencies": {
"@apollo/client": "^3.3.6",
"axios": "^0.21.1",
"graphql": "^15.4.0",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-router-dom": "^5.1.2",
"react-scripts": "^4.0.0"
},
"devDependencies": {
"prettier": "^2.1.2",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-cypress": "^2.11.2",
"eslint-plugin-prettier": "^3.1.4",
"@types/jest": "^26.0.15",
"@types/lodash.merge": "^4.6.6",
"@types/node": "^14.14.6",
"@types/react": "^16.9.55",
"@types/react-dom": "^16.9.5",
"@types/react-router-dom": "^5.1.3",
"cypress": "^6.4.0",
"http-proxy-middleware": "^1.0.3",
"lodash.merge": "^4.6.2",
"start-server-and-test": "^1.11.7",
"typescript": "^4.5.4"
},

Tsconfig.json

{
"compilerOptions": {
"baseUrl": ".",
"target": "es5",
"lib": [
"es6",
"dom"
],
"allowJs": true,
"rootDir": "src",
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"sourceMap": true,
"declaration": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noImplicitAny": false
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"build"
],
"typeRoots": [
"./node_modules/@types"
],
"types": [
"react",
"react-dom",
"react-dom-router",
"jest",
"node"
]
}

Eslintrc.js

{
"parser": "@typescript-eslint/parser", // Specifies the ESLint parser
"extends": [
"react-app",
"plugin:react/recommended", // Uses the recommended rules from @eslint-plugin-react
"plugin:@typescript-eslint/recommended", // Uses the recommended rules from @typescript-eslint/eslint-plugin+   'prettier/@typescript-eslint',  // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
"plugin:prettier/recommended" // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
],
"plugins": ["react", "@typescript-eslint", "jest", "cypress"],
"env": {
"browser": true,
"es6": true,
"jest": true
},
"parserOptions": {
"ecmaVersion": 2018, // Allows for the parsing of modern ECMAScript features
"sourceType": "module", // Allows for the use of imports
"ecmaFeatures": {
"jsx": true // Allows for the parsing of JSX
}
},
"rules": {
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/no-redeclare": "off",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/triple-slash-reference": "off"
},
"settings": {
"react": {
"version": "detect" // Tells eslint-plugin-react to automatically detect the version of React to use
}
}
}
12866 次浏览

did you check your extensions? maybe you are using some auto import or some intellisense that has been replaced in some vscode update. Could you check if you have prettier as default formatter in your vscode settings? and check where prettier library is coming from (node_modules, vscode lib, both?) maybe use .prettierrc file too, I have this settings in mine

{
"bracketSpacing": true,
"jsxBracketSameLine": false,
"singleQuote": true,
"trailingComma": "all",
"arrowParens": "avoid",
"endOfLine": "auto",
"proseWrap": "preserve",
"printWidth": 100 //max width of linecode
}

I noticed TS 4.5.x in the dependencies. Things like this have been happening with versions of other libraries (e.g. prettier) that don't properly account for this TS change:

// < 4.5.0
import type { ThingType } from 'mylib';
import { Thing2 } from 'mylib';


// >= 4.5.0
import { type ThingType, Thing2 } from 'mylib';

The reason a restart is working for many people is that VSCode may keep a process alive from prior to an update. The process is killed when it closes, then, provided that compatible versions of prettier and ts are installed, it will work on restart. If it's still not working, you'll either have to upgrade prettier or downgrade TS until you can get a working set of dependencies cobbled together.

Restarting the Extension Host solved the problem for me.

To do so, open the Command Palette (default keyboard shortcut CtrlP or P) and search for:

Developer: Restart Extension Host

Prettier 2.6.0 is released now and fixes this issue. This was caused by an outdated TypeScript parser. Please upgrade prettier.

https://prettier.io/blog/2022/03/16/2.6.0.html#typescript