2013-08-22 2 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».

Если бы я поменяться в течение двух верхних модулей DEFS я больше не получить ожидаемую ошибку

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; 
} 

Я на самом деле хотел бы ошибка, чтобы показать, чтобы указать, я сделал ошибку в IDE. Мой вопрос, почему он появляется для первого примера, но не второго?

+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

Спасибо Стив. Размышление о декларациях интерфейсов - все это ставится в самое раннее местоположение, помогает мне структурировать мой код. Эта теория держится за то, как я изменил порядок моего «/// ». Моя цель для вышеуказанного кода - создать простой инжектор зависимостей, где я могу аннотировать интерфейс, когда я регистрирую свои конкретные классы и включаю соответствующий интерфейс типа. –