A TypeScript Language Service Plugin to auto-complete and insert Namespace Import.
We often use an object as a namespace.
// someLogics.ts
export const someLogics = {
calculate() { ... },
print() { ... },
};
// main.ts
import { someLogics } from "./someLogics.ts";
someLogics.calculate()
// `someLogics` is auto-completable without import!
This is good way in developer experience, but it obstruct tree-shaking. In this case, someLogics.print
will be included in bundle although it's not used.
To keep tree-shaking working, we can use Namespace Import.
// someLogics.ts
export function calculate() { ... }
export function print() { ... }
// main.ts
import * as someLogics from "./someLogics.ts";
someLogics.calculate()
// `someLogics` is NOT auto-completable without import :(
Now we can tree-shake someLogics.print
. However, developer experience get worse because we can't auto-complete someLogics
without import statement. We need to write import statement by ourselves.
typescript-plugin-namespace-import resolves this problem by making Namespace Import auto-completable.
Install with npm/yarn.
npm install -D typescript-plugin-namespace-import
# or yarn add -D typescript-plugin-namespace-import
Then add this plugin in tsconfig.json
.
{
"compilerOptions": {
"plugins": [
{
"name": "typescript-plugin-namespace-import",
"options": {
"paths": ["src/logics"]
}
}
]
}
}
paths
option is required. See below for detail.
Value: string[]
Specify directory in relative path to the project's root (tsconfig.json
's dir). All .ts
or .js
files in the directories can be Namespace Imported with auto-completion.
Example:
"options": {
"paths": ["src/logics"]
}
Value: boolean
If true, named export from files in paths
won't be shown in auto-completion.
Example:
"options": {
"paths": ["src/logics"],
"ignoreNamedExport": true
}
Value: "upperCamelCase" | "lowerCamelCase"
Transform import name. If not set, the filename will be used as an import name.
Example:
"options": {
"paths": ["src/logics"],
"nameTransform": "lowerCamelCase"
}
Then SomeLogic.ts
will be imported like import * as someLogic from "./SomeLogic"
.