2013-08-22 4 views
2

내 프로젝트 중 하나에서 예기치 않은 행동을하고 있었으므로 문제가되는 가장 작은 예제로 문제를 해결했습니다. 나는 최신 타이프 라이터가 0.9.1.1상수로 오버로딩

module module2 { 

    export interface IAnimal { 

     colour:string; 
    } 
} 

module module1 { 

    export interface IInjector { 
     get(className:string):void; 
    } 
} 

module module1 { 

    export interface IInjector { 
     get(className: "module2.IAnimal"):module2.IAnimal; 
    } 

    class Injector implements module1.IInjector { 

     public get(className:string):any { 

      return {colour:"Blue"}; 
     } 
    } 

    export var injector:IInjector = new Injector(); 
} 

module module2 { 

    module1.injector.get("module2.IAnimal").surname; 
} 

를 구축 사용하고하면 예상 오류 오류 TS2094를 생성 : 속성 '성이'유형의 값 'IAnimal'에 존재하지 않습니다. 내가 최고 두 개의 모듈의 인증 된 정의를 통해 교환 할 경우

나는 더 이상 내가 실제로 오류가 나는 IDE에서 실수를 한 표시 할 때 보여 드리고자합니다

module module1 { 

    export interface IInjector { 
     get(className:string):void; 
    } 
} 

module module2 { 

    export interface IAnimal { 

     colour:string; 
    } 
} 

module module1 { 

    export interface IInjector { 
     get(className: "module2.IAnimal"):module2.IAnimal; 
    } 

    class Injector implements module1.IInjector { 

     public get(className:string):any { 

      return {colour:"Blue"}; 
     } 
    } 

    export var injector:IInjector = new Injector(); 
} 

module module2 { 

    module1.injector.get("module2.IAnimal").surname; 
} 

예상되는 오류를 얻을. 제 질문은 왜 첫 번째 예제가 나타나지만 두 번째 예제는 나타나지 않는 것입니까?

+0

멋진 브렌든입니다. 그래도 컴파일러 오류처럼 보입니다. – basarat

답변

0

좋아요, 저는 이것에 대해 조사해 보았습니다. 이 코드는 마치 IAnimal 인터페이스가 선언되기 전에 사용되고 있었던 것처럼 행동합니다. 한 번에 전체 IInjector 인터페이스를 선언하지만 IAnimal이 정의되기 전에 비슷한 동작을 얻을 수 있습니다. 타이프 스크립트 컴파일러는 하나에 인터페이스 선언의 모든를 이동할 때 당신은 모든 종속성이 시점 이전했다 확인해야합니다 그래서 그들은, 초기 위치에서 선언 된 것처럼

module module1 { 
    export interface IInjector { 
     get(className: "module2.IAnimal"):module2.IAnimal; 
     get(className:string):void; 
    } 
} 

module module2 { 
    export interface IAnimal { 
     colour:string; 
    } 
} 

module module1 { 
    class Injector implements module1.IInjector { 
     public get(className:string):any { 
      return {colour:"Blue"}; 
     } 
    } 

    export var injector:IInjector = new Injector(); 
} 

module module2 { 
    // x is any 
    var x = module1.injector.get("module2.IAnimal"); 
} 

아마도 그것은 그들을 취급합니다. (참고 : 나는 이것이 올바르다는 것을 말하는 것이 아니며, 단지 그것이 어떻게 행동하는지 말하고있는 것입니다.)

다음 번 이동은 check the TypeScript issues list이며이 버그가보고 된 것을 발견하지 못하면 추가하여 예상되는 동작으로 확인되거나 그렇지 않은 경우 수정 될 수 있습니다.

+0

Thanks Steve. 인터페이스 선언이 모두 초기 위치에 있다고 생각하면 코드를 구조화하는 데 도움이됩니다. 이 이론은 내가 "/// <참조 경로 = ....>"의 순서를 어떻게 재구성했는지에 대한 것입니다. 위의 코드에 대한 나의 목표는 필자가 구체적인 클래스를 등록하고 해당 유형 인터페이스를 포함 할 때 인터페이스에 주석을 달 수있는 간단한 의존성 인젝터를 만드는 것이다. –