TypeScript多余字段检查和类型推断错误
在类型推断方面,我似乎遇到了TS编译器的一个奇怪的边缘情况。下面的代码(带注释的行)应该(我相信)产生编译错误,但实际上不会TypeScript多余字段检查和类型推断错误,typescript,type-inference,Typescript,Type Inference,在类型推断方面,我似乎遇到了TS编译器的一个奇怪的边缘情况。下面的代码(带注释的行)应该(我相信)产生编译错误,但实际上不会 interface IReturned { theField?: string; } interface IFactory { (): IReturned; } var factory : IFactory = function () /* : IReturned */{ return { BROKEN: 'ERROR' }
interface IReturned {
theField?: string;
}
interface IFactory {
(): IReturned;
}
var factory : IFactory = function () /* : IReturned */{
return {
BROKEN: 'ERROR'
}
};
var instance = factory();
// instance.BROKEN;
理想情况下,应该将工厂函数的返回类型推断为IReturned,这意味着返回包含多余字段的对象文字是编译错误,因此设置“breaked”属性应该无效
如果函数以IReturned作为其返回类型进行显式注释,则确实会发生这种情况。“instance”变量的类型也被正确推断,尝试访问下面一行的“breaked”字段也是一个错误
我是不是遗漏了什么?有没有一种方法可以在不必到处添加冗余类型定义的情况下使其正常工作?这是可以接受的,因为它是兼容的 假设您定义了一个接口
IRet2
,该接口扩展了iretured
,并添加了一个字段breaked
。由于接口IRet2
扩展了iretured
,因此返回类型为IRet2
的对象是有效的,其中必须返回iretured
:
interface IReturned {
theField?: string;
}
interface IRet2 extends IReturned {
BROKEN: string;
}
interface IFactory {
(): IReturned;
}
var factory : IFactory = function (): IRet2 {
return {
BROKEN: 'ERROR'
}
};
var instance = factory();
您的代码遵循相同的原则,但其推断类型隐式扩展了iretured