Search code examples
typescripttsconfig

Extending tsconfig.json file doesn't seem to extend anything


I have a project from which I need to build two different products. Say I have

./src/advanced
./src/basic

All code is written in Typescript so I need to compile this with tsc

Because of this, I created 3 tsconfig files

tsconfig-base.json

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "noImplicitAny": false,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es6",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./src",
    "lib": ["es2018", "dom", "dom", "dom.iterable", "es6"],
    "importHelpers": true,
  },
  "exclude": ["node_modules", "**/*.spec.ts","dist"]

Now to build the basic product I have

tsconfig-basic.json

{
  "extends": "./tsconfig-base.json",
  "compilerOptions": {
    "noEmitHelpers": true
  },
  "files": [
     "basic/main.ts"
  ]
}

And I compile as follows

$> tsc -p ./tsconfig-basic.json

Now I have 2 issues

1) The file basic/main.ts cannot be found, its looking in ./basic/main.ts while it should have been ./src/basic/main.ts. Why is baseUrl not prepended?

2) If (1) is fixed, the compiled files are not written to ./dist. Why is "outDir": "./dist from the base file not used here? When I add the outDir to tsconfig-basic.json it works as expected

Anyway, it looks like that extending here doesn't work, or works differently than I expect. Any suggestion how to improve my setup?


Solution

  • 1) baseUrl is only meant to be used with bundlers like webpack. See discussion on TypeScript/10866


    2) This is unfortunately by design. See issue TypeScript/29172

    Quote Wesley Wigham (Microsoft Employee):
    Path-based compiler options (outDir, outFile, rootDir, include, files) are resolved from the config file they're found in)

    You will need to repeat the outDir for every tsconfig.json file you have.