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/exportis 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
      exportstatements
- 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 .