This blog post, like most, is for my own edification. Organizing TypeScript modules is hard for me. These notes are from the official TypeScript module advice .
namespaces
- these were previously "internal modules"
- avoid, unless there is a strong reason
modules
- these were previously "external modules"
- a module hides its members
-
expose members with
export
-
consume exported members with
import
-
a file containing a top-level
import
/export
is a module
export
- we can export any module member
- e.g. variable, function, class, interface...
- exports have several useful forms
-
export { Foo };
-
export { Foo as Bar };
-
export class Foo { }
-
export { Foo as Bar } from "./Foo";
-
export * from "./Foo";
-
export default class Foo { } // inline default
- if inline default fails, use this form
-
export default MyEnum
-
export default IMyInterface
import
- we can import any member that modules export
- imports have several useful forms
-
import { Foo } from "./Foo";
-
import { Foo as Bar } from "./Foo";
-
import * as Foobar from "./Foo";
-
import "./Foo"; // side-effects only
-
import foo from "./Foo"; // with default
-
import bar from "./Foo"; // with rename
export advice
- avoid nesting
- export classes; avoid using namespaces
- export functions; avoid using static methods
- if a file has a single export
-
then use
export default
-
else use multiple
export
statements - re-export when extending
-
e.g.
export { SubClass as ParentClass }
import advice
-
list each named item
import { x, y, z } ...
-
if lots, use a namespace
import * as Foo ...
For more details, read the official modules advice from TypeScript .