ECMAScript 2015 부터 Javascript에는 모듈 개념이 있습니다. Typescript는 이 개념을 공유합니다.

모듈은 전역 스코프가 아닌 자체 스코프 내에서 실행됩니다. 즉 모듈 내에서 선언된 변수, 함수, 클래스 등은 export 양식 중 하나를 사용하여 명시적으로 export 하지 않는 한 모듈 외부에서 보이지 않습니다. 반대로 다른 모듈에서 export 한 변수, 함수, 인터페이스 등을 사용하기 위해서는 import 양식 중 하나를 사용하여 import 해야 합니다.

모듈은 모듈 로더를 사용하여 다른 모듈을 import 합니다. 런타임 시 모듈 로더는 모듈을 실행하기 전에 모듈의 모든 의존성을 찾고 실행해야 합니다. Javascript 에서 사용하는 유명한 모듈 로더로는 CommonJS 모듈 용 Node.js 의 로더와 웹 애플리케이션의 AMD 모듈 용 RequireJS 로더가 있습니다.

ECMAScript 2015와 마찬가지로 Typescript는 최상위 수준의 import 혹은 export 가 포함된 파일을 모듈로 간주합니다. 반대로 최상위 수준의 import 혹은 export 선언이 없는 파일은 전역 스코프에서 사용할 수 있는 스크립트로 처리됩니다. (모듈에서도 마찬가지)

Export

선언 export 하기

StringValidator.ts

export interface StringValidator {
    isAcceptable(s: string): boolean;
}

ZipCodeValidator.ts

import { StringValidator } from "./StringValidator";

export const numberRegexp = /^[0-9]+$/;

export class ZipCodeValidator implements StringValidator {
    isAcceptable(s: string) {
        return s.length === 5 && numberRegexp.test(s);
    }
}

Export 문

Export 문은 사용자를 위해 export 할 이름을 바꿔야 할 때 편리합니다.

class ZipCodeValidator implements StringValidator {
    isAcceptable(s: string) {
        return s.length === 5 && numberRegexp.test(s);
    }
}
export { ZipCodeValidator };
export { ZipCodeValidator as mainValidator };

Re-export 하기

ParseIntBasedZipCodeValidator.ts

export class ParseIntBasedZipCodeValidator {
    isAcceptable(s: string) {
        return s.length === 5 && parseInt(s).toString() === s;
    }
}

// 기존 validator의 이름을 변경 후 export
export {ZipCodeValidator as RegExpBasedZipCodeValidator} from "./ZipCodeValidator";