我在我的一个项目中得到了一些意想不到的行为,所以我把它隔离到最小的例子我仍然有问题。我使用的是最新的TypeScript build 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:属性'surname'在'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 :(得分: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编译器将所有接口声明都卷成一个时,它会将它们视为在最早的位置声明它们,因此您必须确保所有依赖关系都在此之前。 (注意:我不是说这是正确的,我只是说这就是它的表现)。
您的下一步行动将是check the TypeScript issues list,如果您无法找到此错误报告,请将其添加,以便可以将其确认为预期行为,如果不是,则可以修复。