모듈과 네임스페이스는 캡슐화의 두 가지 수단, 코드를 의미 있는 부분으로 나누는 것

새로 작성하는 코드는 네임스페이스가 아닌 모듈로 작성하도록 권장하고 있음

네임스페이스

이것들은 JavaScript에서 다소 오래된 패턴을 공식화 기본적으로 전역 범위에서 선언 충돌을 방지하기 위해 IIFE(즉시실행함수)에서 단순히 코드를 래핑하는 것

네임스페이스 요소를 외부에서 사용 싶다면 export하여 외부에서 사용가능

// typescript file
namespace foo {
    export var x = 10;
    export var y = 20;
}
// compile to javascript
var foo;
(function (foo) {
    foo.x = 10;
    foo.y = 20;
})(foo || (foo = {}));

모듈

모듈은 전역 범위가 아닌 자체 범위 내에서 실행 ( = javscript esm 과 동일한 개념을 가짐 )

TypeScript의 경우 최상위레벨에 import 또는 export 키워드가 있는 파일은 모듈로 취급

모듈 간의 관계는 파일 수준에서 가져오기 및 내보내기 측면에서 지정

*) javascript 모듈특징

  1. 모듈은 자신만의 스코프가 있다. 따라서 모듈 내부에서 정의한 변수나 함수는 다른 스크립트에서 접근할 수 없습니다.

  2. strict mode로 실행

명시적으로 export 하지 않는다면 외부에서 참조할 수 없다