2016-09-01 43 views
1

看来我遇到了TS编译器的一个奇怪的边缘情况,当涉及到类型推断时。下面的代码(和注释行一样)应该(我相信)会产生一个编译错误,但实际上并没有。TypeScript多余的字段检查和类型推断错误

interface IReturned { 
    theField?: string; 
} 
interface IFactory { 
    (): IReturned; 
} 
var factory : IFactory = function() /* : IReturned */{ 
    return { 
     BROKEN: 'ERROR' 
    } 
}; 
var instance = factory(); 
// instance.BROKEN; 

什么理想情况下应该发生的是,工厂函数的返回类型推断为IReturned,这意味着它是一个编译错误返回一个对象文本与它过多的领域,因此,在设置了“破”属性应该不是有效的。

如果使用IReturned将函数显式注释为其返回类型,则确实会发生这种情况。 “实例”变量的类型也被正确推断,并且试图访问下面一行中的“断开”字段也是一个错误。

我失去了一些东西在这里?有没有办法让这个工作无需在任何地方添加冗余类型定义?

回答

1

它被接受,因为它是兼容的。

假设您定义了一个扩展IReturned的接口IRet2并添加了一个字段BROKEN。因为接口IRet2扩展IReturned,它是有效的返回IRet2类型的对象,你必须返回一个IReturned

interface IReturned { 
    theField?: string; 
} 
interface IRet2 extends IReturned { 
    BROKEN: string; 
} 
interface IFactory { 
    (): IReturned; 
} 
var factory : IFactory = function(): IRet2 { 
    return { 
     BROKEN: 'ERROR' 
    } 
}; 
var instance = factory(); 

你的代码都遵循同样的原则,但隐含延伸IReturned推断类型。