How to use paths in tsconfig.json?
I was reading about path-mapping in tsconfig.json
and I wanted to use it to avoid using the following ugly paths:
The project organization is a bit weird because we have a mono-repository that contains projects and libraries. The projects are grouped by company and by browser / server / universal.
How can I configure the paths in tsconfig.json
so instead of:
import { Something } from "../../../../../lib/src/[browser/server/universal]/...";
I can use:
import { Something } from "lib/src/[browser/server/universal]/...";
Will something else be required in the webpack config? or is the tsconfig.json
enough?
This can be set up on your tsconfig.json file, as it is a TS feature.
You can do like this:
"compilerOptions": {
"baseUrl": "src", // This must be specified if "paths" is.
...
"paths": {
"@app/*": ["app/*"],
"@config/*": ["app/_config/*"],
"@environment/*": ["environments/*"],
"@shared/*": ["app/_shared/*"],
"@helpers/*": ["helpers/*"]
},
...
Have in mind that the path where you want to refer to, it takes your baseUrl as the base of the route you are pointing to and it's mandatory as described on the doc.
The character '@' is not mandatory.
After you set it up on that way, you can easily use it like this:
import { Yo } from '@config/index';
the only thing you might notice is that the intellisense does not work in the current latest version, so I would suggest to follow an index convention for importing/exporting files.
https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping
You can use combination of baseUrl
and paths
docs.
Assuming root is on the topmost src
dir(and I read your image properly) use
// tsconfig.json
{
"compilerOptions": {
...
"baseUrl": ".",
"paths": {
"lib/*": [
"src/org/global/lib/*"
]
}
}
}
For webpack
you might also need to add module resolution. For webpack2
this could look like
// webpack.config.js
module.exports = {
resolve: {
...
modules: [
...
'./src/org/global'
]
}
}
Check this similar solutions with asterisk
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
},
If you are using paths, you will need to change back absolute paths to relative paths for it to work after compiling typescript into plain javascript using tsc
.
Most popular solution for this has been tsconfig-paths so far.
I've tried it, but it did not work for me for my complicated setup. Also, it resolves paths in run-time, meaning overhead in terms of your package size and resolve performance.
So, I wrote a solution myself, tscpaths.
I'd say it's better overall because it replaces paths at compile-time. It means there is no runtime dependency or any performance overhead. It's pretty simple to use. You just need to add a line to your build scripts in package.json
.
The project is pretty young, so there could be some issues if your setup is very complicated. It works flawlessly for my setup, though my setup is fairly complex.
This works for me:
yarn add --dev tsconfig-paths
ts-node -r tsconfig-paths/register <your-index-file>.ts
This loads all paths in tsconfig.json. A sample tsconfig.json:
{
"compilerOptions": {
{…}
"baseUrl": "./src",
"paths": {
"assets/*": [ "assets/*" ],
"styles/*": [ "styles/*" ]
}
},
}
Make sure you have both baseUrl and paths for this to work
And then you can import like :
import {AlarmIcon} from 'assets/icons'