Visual Studio klagar på TypeScript-fel som tsc och eslint inte gör


I morse startade jag om min dator och öppnade Visual Studio Code och fick detta fel som jag aldrig har haft tidigare:

Jag ändrade inte någon kod i mitt projekt (dvs. git status är tom). Jag är inte säker på om detta började idag, eller om jag bara aldrig har märkt de filerna och det har pågått ett tag. Men jag är säker på att dessa fel inte visade sig för 5 dagar sedan, och den felaktiga koden har funnits där längre än så. Här är den koden:

        } catch (e) {
            if (typeof e === "string") {
                throw new Error(
                    `...: ${e}`
                );
            } else {
                e.message = `... ${e.message}`;
                throw e;
            }
        }

Om jag kör tsc eller eslint, klagar ingen av dem på det här felet. Jag vill att VSCode rapporterar det som tsc/eslint skulle rapportera, inte bestämmer egna typkontrollregler. Hur blir jag av med dessa fel?

Jag vet inte vad jag inte vet. Jag antar att jag bara bifogar mina inställningar:

användare

{
    "files.autoSave": "afterDelay",
    "explorer.confirmDelete": false,
    "security.workspace.trust.untrustedFiles": "open",
    "explorer.confirmDragAndDrop": false,
    "docker.showStartPage": false,
    "editor.fontSize": 14,
    "editor.renderWhitespace": "all",
    "[json]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "typescript.tsserver.experimental.enableProjectDiagnostics": true
}

Jag växlade typescript.tsserver.experimental.enableProjectDiagnostics, och det har ingen effekt på detta felmeddelande.

arbetsyta

{
    "workbench.editorAssociations": {
        "*.ipynb": "jupyter-notebook"
    },
    "notebook.cellToolbarLocation": {
        "default": "right",
        "jupyter-notebook": "left"
    },
    "python.formatting.provider": "black",
    "eslint.workingDirectories": [
    "./firebase/functions",
    ],
    "eslint.format.enable": false,
    "prettier.enable": true,
    "[typescript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[jsonc]": {
        "editor.defaultFormatter": "vscode.json-language-features"
    },
    "typescript.format.semicolons": "insert",
    "editor.detectIndentation": false,
    "prettier.configPath": "firebase/functions/.prettierrc.json",
}

Här är en censurerad version av min package.json:

{
  "name": "...",
  "scripts": {
    "lint": "eslint .",
    "build": "tsc --build .",
    "test": "npm run lint && npm run build && ...",
    ...
  },
  "engines": {
    "node": "12"
  },
  "main": "lib/index.js",
  "dependencies": {
    "@firebase/testing": "^0.20.8",
    "@types/child-process-promise": "^2.2.1",
    "@types/follow-redirects": "^1.13.0",
    "@types/node-fetch": "^2.5.7",
    "@types/progress": "^2.0.5",
    "@types/request": "^2.48.7",
    "@types/uuid": "^8.3.0",
    ...
  },
  "devDependencies": {
    "@types/mocha": "^9.0.0",
    "@types/node": "^14.10.2",
    "@typescript-eslint/eslint-plugin": "^4.28.5",
    "@typescript-eslint/parser": "^4.28.5",
    "eslint": "^7.31.0",
    "firebase-functions-test": "^0.2.2",
    "lodash": "^4.17.21",
    "mocha": "^8.1.3",
    "prettier": "^2.3.2",
    "typescript": "^3.9.7"
    ...
  },
  "private": true
}

(mycket orelaterad till det här problemet konstigheter i den här filen. sorry; det är gammalt och jag jobbar på att förbättra det).

Här är min tsconfig.json:

{
    "compilerOptions": {
        "rootDir": ".",
    },
    "files": [],
    "references": [
        {
            "path": "./src"
        },
        {
            "path": "./test"
        },
    ]
}

Observera: den här filen finns i ./firebase/functions, inte i projektets rotmapp.

Här är ./firebase/functions/src/tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "outDir": "../lib",
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "sourceMap": true,
    "strict": true,
    "lib": ["es2020", "dom"],
    "target": "es2019",
    "composite": true,
    "allowSyntheticDefaultImports": true
  },
  "compileOnSave": true,
  "types": ["node", ...],
  "include": ["**/*.ts"]
}

Här är ./firebase/functions/test/tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "outDir": "../libtest",
    "strict": false,
    "composite": true,
    "sourceMap": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true
  },
  "include": [
    "**/*.ts"
  ]
}

Hur får jag Visual Studio Code att rapportera samma fel som min tsc och eslint - inte mer, inte mindre?

Svar #1

Din VS Code använder uppenbarligen en nyare version av TypeScript än den som finns i din package.json, och som ett resultat används ett nytt alternativ som gör att fel i catch-block behandlas som unknown istället för any. För att åtgärda detta, titta längst ner till höger i ditt VS Code-fönster och du borde se TypeScript-versionen, något i stil med detta:

Klicka på versionsnumret så visas en rullgardinsmeny högst upp på skärmen

Klicka på "Välj TypeScript-version" för att ändra den.

Vanligtvis kan VS Code ta reda på din arbetsytas version och kommer att lista den som ett alternativ. Om det av någon anledning inte kan, eller om du vill använda en annan version, kan du tala om för TypeScript vad den ska göra med inställningen "typescript.tsdk". För information om hur du ställer in det, se denna sida: https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-the-workspace-version-of-typescript