2016-10-07 2 views
1

네임 스페이스 (내부 모듈) 내에서만 사용할 인터페이스가 있으며 네임 스페이스 외부에서 사용해서는 안됩니다.TypeScript : 네임 스페이스 내에서 내부 인터페이스를 사용하는 방법

예 인터페이스 : 나는 (내가 싶지 않아) 인터페이스를 내 보내지 않으면 같은 네임 스페이스 내에서이 인터페이스를 구현하려고 할 때

namespace Test { 
    interface IInterface { 
     getId(): number; 
     getName(): string; 
    } 
} 

불행하게도 나는 오류가 발생합니다.

구현 클래스 : 제공

namespace Test { 
    class Implementer implements IInterface { 
     private location: Location; 

     public getId(): number { 
      return 1; 
     } 

     public getName(): string { 
      return "implementer name"; 
     } 
    } 
} 

: TS2304이 : 이름이 '는 IInterface'을 찾을 수 없습니다. 'Implementer.ts'의

'Location'형식의 private 멤버는 동일한 네임 스페이스에서 나 자신이 정의한 새로운 유형/클래스이기도하며 'Location'유형이 이미 전역 공간에 있으므로 네임 스페이스를 사용하는 실제 이유입니다. 충돌하는 이름을 가진

클래스 네임 스페이스 외부에서 사용하는 경우 : 또한

namespace Test { 
    class Location { 
     private name: string = null; 
     constructor(name: string) { 
      this.name = name; 
     } 
    } 
} 

: 어떤 모듈을 사용하지 않는 내가 클래스를 타이프 ​​자바 스크립트에서 몇 가지 유형을 전환하고있다. /// <reference path="IInterface.ts" /> 도우미를 사용하면 작동하지 않으며 여기서는 문제가되지 않습니다. 나는 또한 어떤 모듈 로더도 소개하고 싶지 않다.

그렇다면 인터페이스를 내보내지 않고 동일한 네임 스페이스에서 내 인터페이스를 사용하려면 어떻게해야합니까?

+0

아마 관련 : http://stackoverflow.com/questions/39827281/modules-vs-namespaces-what-is-the-correct-way-to-organize-a-large-typescript-p/39827997#39827997 – Paleo

+0

다른 질문은 내부 인터페이스 또는 네임 페이 또는 모듈 내의 인터페이스의 액세스 가능성을 언급하지 않습니다. – Huupke

+0

예.하지만 새 프로젝트를 시작하면 모듈로 전환하는 것을 고려해야합니다. 그것은 단지 제안 일뿐입니다. :) – Paleo

답변

1

마지막 질문 인 "네임 스페이스 외부에서 사용되는 경우 충돌하는 이름이있는 클래스"에 처음 대답합니다. A global object Location이 이미 브라우저에 있습니다. 이 이름은 모듈이나 네임 스페이스에서 클래스에 사용할 수 있습니다. 그렇지 않으면 다른 이름을 선택해야합니다.

그런 다음 네임 스페이스를 분할하려고합니다. 그냥 export 회원 IInterface 인생 외부에 노출하기 위해 :

namespace Test { 
    export interface IInterface { 
     getId(): number; 
     getName(): string; 
    } 
} 

설명 the handbook에서

:

네임 스페이스는 단순히 글로벌 네임 스페이스에 자바 스크립트 객체를 이름이 지정됩니다. 여기

는 그림 (코드 in the TS Playground 참조) :

var Test; 
(function (Test) { 
    Test.name = 'abc'; 
})(Test || (Test = {})); 

var Test; 
(function (Test) { 
    var message = 'Hello, ' + Test.name; 
})(Test || (Test = {})); 

이 네임 스페이스 Test이다 "간단하게 명명 : 컴파일 후

namespace Test { 
    export let name = 'abc' 
} 

namespace Test { 
    let message = 'Hello, ' + name; 
} 

을, 여기에 자바 스크립트 코드 글로벌 네임 스페이스의 JavaScript 객체 ". 변수 message은 IIFE 외부에서 재사용 될 수 없음을 알 수 있습니다.동일한 전역 변수 (네임 스페이스)에 대해 세 번째 IIFE를 생성하더라도 Test.

+1

첫 번째 내보내기는 인터페이스가 네임 스페이스 또는 모듈 외부에서 액세스 할 수 있도록하므로 원치 않는 경우가 있습니다. 이미 존재하는 이름의 문제는 내 자신의 객체의 이름을 변경하여 처리해서는 안됩니다. 네임 스페이스와 모듈은 주로이 문제를 해결하기 위해 존재합니다. – Huupke

+0

@Huupke, 나는 설명을 추가했다. – Paleo

관련 문제