2

我在我的一个项目中遇到了一些意想不到的行为,所以我将它隔离为我能做到的仍然存在问题的最小示例。我正在使用最新的 TypeScript 版本 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”类型的值上不存在“姓氏”属性。

如果我交换前两个模块的定义,我不再得到预期的错误

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 中犯了错误。我的问题是为什么它出现在第一个例子中而不是第二个例子中?

4

1 回答 1

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

也许当 TypeScript 编译器将所有接口声明合并为一个时,它会将它们视为在最早的位置声明它们,因此您必须确保所有依赖项都在此之前。(注意:我并不是说这是正确的,我只是说这就是它的行为方式)。

您的下一步将是检查 TypeScript 问题列表,如果您找不到报告的此错误,请将其添加,以便可以确认它是预期的行为,如果不是,则可以修复。

于 2013-08-22T09:46:46.950 回答