2017-05-04 7 views
1

모듈 및 네임 스페이스에 대한 내용을 지우려면 Typescript 문서를 다시 읽었지만 여전히 어두운 점이 있습니다.Typescript 2.x에서 네임 스페이스 만들기

  1. declare namespace Foo{}
  2. 네임 스페이스를 생성하는 3 가지 방법 중
  3. namespace Foo{}
  4. export namespace Foo{}

, 각각의 용도는 무엇인가?

유효성 검사 네임 스페이스를 만들고이 네임 스페이스에 기여하는 파일이 3 개 있다고 가정 해 봅시다. 이 작업을 수행하는 올바른 방법은 무엇이며 다른 파일/모듈에서 유효성 검사 네임 스페이스의 코드를 가져 오는 (사용하는) 방법은 무엇입니까?

답변

2

올바른 방법은 무엇이며 어떻게해야합니까? 다른 파일/모듈의 유효성 검사 네임 스페이스에있는 코드를 가져 오기 (사용)할까요?

하나의 질문에 "가져 오기 (사용)"및 "파일/모듈"이라고 말하면 매우 다른 두 가지 상황에 대해 묻고 있으며 답변은 각각 다릅니다.

import 및 모듈을 사용하여이를 수행 할 방법이 없습니다. 각 모듈은 별개의 분리 된 범위이며, 각 모듈에 namespace Validation을 정의하면 다른 범위의 선언이 병합되지 않으므로 3 개의 다른 네임 스페이스를 만들 수 있습니다. 자, declare global을 사용하여 모듈 범위를 벗어날 수 있지만 모듈의 명시된 목적을 상실합니다 - 전역 제거.

모듈이 아닌 파일 (즉, import 또는 export이없는 파일)을 사용하여이를 수행 할 수 있습니다. 그러나 모듈화되지 않은 자바 스크립트 (또는 타이프 스크립트)로만 제한됩니다. namespace Validation은 전체 범위에 있으므로 import 및 모듈을 사용할 수 없으며 모든 파일을 컴파일하고 연결해야 <script> 태그로로드하기에 적합한 단일 스크립트를 생성해야합니다. 이 Foo을 사용할 수 있도록 일부 외부 파일 (현재 컴파일에 포함되지 않음)에 정의 된 네임 스페이스 푸,이 존재 함을 선언합니다

declare namespace Foo {} 

변형 특정 구문으로

How do I use namespaces with TypeScript external modules?

참조하는 {} 내에서 선언 된 것을 포함한다고 가정합니다. 여기에는 정의가 아니라 선언 만 포함될 수있는 {}이 있습니다.

namespace Foo {} 
,

이 (가) 작성하는 네임 스페이스 Foo

export namespace Foo {} 

이 또한 네임 스페이스 푸 만들지 만 export (이것은 또한 파일이 모듈 여부에 따라 달라집니다는 소스 파일에 나타나는 위치에 따라 다른 의미를 가질 수 있습니다, 그러나 나는 모듈이 없다면 얼마나 유용한 지 자세히 알기를 원치 않는다.

export이 최상위 레벨에 있으면 파일을 모듈로 변환하고 Foo을 가져 와서 다른 모듈에서 사용할 수는 있지만 확장 할 수는 없습니다. export이 최상위 레벨에 없으면 다시 의존성이 있습니다. 일부 내 보낸 네임 스페이스에있는 경우 해당 네임 스페이스를 가져온 모듈에서 액세스 할 수있는 중첩 네임 스페이스를 정의합니다. 그것이 수출되지 않은 네임 스페이스에 있다면, export은 아무런 효과가 없다고 생각합니다.