Namespace and Module
When declaring a module (or namespace), there are two options:
- declaration wrapped in
declare {namespace,module} <name> {
, or - top-level declaration
Top-level declarations in a source file with no top-level import or export declarations belong to the global namespace. Top-level declarations in a source file with one or more top-level import or export declarations belong to the module represented by that source file. (link, need to scroll down a bit)
Namespace (Internal Module)
- Use
declare namespace X {
syntax. Avoid
declare module X {
syntax.Why?
declare namespace X {
will fixate the namespace to the nameX
, which is what you want.tslint
no-internal-module
// bad declare module Chai { // stuff... } // good declare namespace Chai { // stuff... }
Module (External Module)
Do not wrap typings in
declare module "X" {
. Expose as top-level declarationWhy?
declare module "X" {
will cause name conflict if consumer use two different version of the same library.// bad declare module "X" { export interface A { // stuff... }; } // good export interface A { // stuff... };
Note
Prior to TypeScript 1.5, there are two types of modules:
- Internal module (
declare module X {
) - External module (
declare module "X" {
)
In TypeScript 1.5, the term and keyword namespace
is introduced.
The nomenclature has changed.
- Internal module -> namespace
- External module -> module
The declare module X {
syntax exists for backward compatibility.
Reference
https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Namespaces.md https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Namespaces%20and%20Modules.md https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Modules.md