Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 常数重载_Typescript - Fatal编程技术网

Typescript 常数重载

Typescript 常数重载,typescript,Typescript,我在我的一个项目中遇到了一些意想不到的行为,因此我将其隔离到了我能找到的仍然存在问题的最小示例中。我使用的是最新的TypeScript版本0.9.1.1 module module2 { export interface IAnimal { colour:string; } } module module1 { export interface IInjector { get(className:string):void;

我在我的一个项目中遇到了一些意想不到的行为,因此我将其隔离到了我能找到的仍然存在问题的最小示例中。我使用的是最新的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”的值上不存在属性“姓氏”

如果我交换最上面的两个模块def,我将不再得到预期的错误

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中犯了错误。我的问题是,为什么第一个示例会显示它,而第二个示例不会显示它?

好的,我已经对此做了一些挖掘。代码的作用就好像
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编译器将所有接口声明合并为一个声明时,它会将它们视为在最早的位置声明,因此您必须确保所有依赖项都在这一点之前。(注意:我不是说这是正确的,我只是说这就是它的表现)


你的下一步行动将是,如果你找不到报告的此bug,请将其添加进来,以便确认它是否符合预期行为,或者如果不符合预期行为,则将其修复。

这太棒了,brendan。看起来像是编译器错误,谢谢Steve。考虑接口声明都放在最早的位置有助于我构建代码。这个理论证明了我是如何重组我的“//”的顺序的。上面代码的目的是创建一个简单的依赖性注入器,在这里我可以在注册具体类并包含相应的类型接口时对接口进行注释。