2

This question is a follow-on from How to use paths in tsconfig.json? except I want to do it for a single module.

I have a module:

  • It's implemented in src/functions/foo.ts
  • Its contents are:

    export default interface Bar {
    }
    
  • It's imported by another module elsewhere using a non-relative path:

    import * as Foo from "foo"
    

The compiler doesn't find it:

error TS2307: Cannot find module 'foo'

This tsconfig doesn't fix that problem ...

{ "compilerOptions": { "noEmit": true, "strict": true, "module": "commonjs", "target": "es2017", "noImplicitAny": true, "moduleResolution": "node", "sourceMap": true, "outDir": "build", "baseUrl": ".", "paths": { "foo": ["src/functions/*"], "*": [ "node_modules/*" ] } }, "include": [ "./src/**/*", "./typings/**/*", "./test/**/*", "./test-integration/**/*" ] }

... but this does:

"paths": { "*": [ "node_modules/*", "src/functions/*" ] }


Why didn't the first version of paths work --- what was I doing wrong, what can I do to ensure that "src/functions/*" is used only when importing foo (and not when importing *)?

(I'm using tsc version 3.1.6 on Windows with Node.js).

ChrisW
  • 54,973
  • 13
  • 116
  • 224

1 Answers1

4

You are assigning a word foo to the content of a directory src/functions/*.

But foo like that can only be used to specify the exact location of a single file (module), without a wildcard, so, like this:

"paths": {
    "foo": ["src/functions/foo"],
    "*": [
        "node_modules/*"
    ]
}

What you are probably looking for is

"paths": {
    "foo/*": ["src/functions/*"],
    "*": [
        "node_modules/*"
    ]
}

(foo/* instead of foo)

ChrisW
  • 54,973
  • 13
  • 116
  • 224
Kokogino
  • 984
  • 1
  • 5
  • 17
  • Thank you, it was the first one I was looking for. I think the second would be used if I wanted to import something from `src/functions/bar.ts` by using `import * as BAR from "@foo/bar"` – ChrisW Dec 02 '18 at 19:39