Search code examples
typescriptvisual-studio-codetsconfig

How to use multiple tsconfig files in vs-code?


I am using Visual Studio Code and have a fairly common project structure:

├── client/
│   ├── tsconfig.json
├── shared/
├── server/
│   ├── tsconfig.json
├── project.json

The two tsconfig files have different settings (e.g. the one under client/ targets ES5, the one under server/ targets ES6). Note that there is no tsconfig in the root directory.

The problem is that I want the shared directory to be included in both projects. I can't do this using tsconfig because the exclude option won't let me include a folder that is in a higher directory than the tsconfig.json, and using files I have to constantly keep the list of files up to date as it doesn't support globs.

Note that I can compile fine by adding the shared folder into tsc, what I want is for the Visual Studio Code IDE to recognise the shared code for intellisense etc.

Is the only option to wait for filesGlob?


Solution

  • These days it is much easier as vscode has better support for this.

    You can use this directory structure so all the code is independent:

    ├── frontend/
    │   ├── src/
    │   │   ├── <frontend code>
    │   ├── package.json
    │   ├── tsconfig.json
    ├── shared/
    │   ├── package.json
    ├── backend/
    │   ├── src/
    │   │   ├── <backend code>
    │   ├── package.json
    │   ├── tsconfig.json
    

    Then in both the backend and frontend tsconfig.json:

    {
      "compilerOptions": {
        "paths": {
          "~shared/*": ["../shared/*"]
        },
        "rootDirs": [
          "./src",
          "../shared"
        ]
      }
    }
    

    To allow access to the shared code e.g.:

    import { Foo } from '~shared/foo';
    

    Old Answer

    Use a single tsconfig.json for the root. And then extend it for each project (backend tsconfig.server.json, frontend tsconfig.webpack.json).

    • Root tsconfig.json include: ['src'] to ensure all files get typechecked in the IDE
    • Backend tsconfig.server.json exclude: ['src/app'] the frontend files
    • Frontend : tsconfig.webpack.json exclude: ['src/server'] the backend files

    Folder Structure

    ├── src/
    │   ├── app/    < Frontend
    │   ├── server/ < Backend
    │   ├── common/ < Shared
    ├── tsconfig.json
    ├── tsconfig.server.json
    ├── tsconfig.webpack.json
    

    Config Files

    tsconfig.json

    {
      "compilerOptions": {
        "noImplicitAny": true,
        "strictNullChecks": true
      },
      "include": [
        "src"
      ]
    }
    

    tsconfig.webpack.json

    {
      "extends": "./tsconfig.json",
      "exclude": [
        "src/app"
      ]
    }
    

    tsconfig.server.json

    {
      "extends": "./tsconfig.json",
      "exclude": [
        "src/server"
      ]
    }
    

    More

    Example lesson (by me)