在类型推断方面,似乎我遇到了TS编译器的奇怪边缘情况。下面的代码(按照注释的行),应该(我相信)产生编译错误,但它实际上没有。
interface IReturned {
theField?: string;
}
interface IFactory {
(): IReturned;
}
var factory : IFactory = function () /* : IReturned */{
return {
BROKEN: 'ERROR'
}
};
var instance = factory();
// instance.BROKEN;
理想情况下应该将工厂函数的返回类型推断为IReturned,这意味着返回具有多余字段的对象文字是编译错误,因此设置“BROKEN”属性应该无效。
如果使用IReturned作为返回类型显式注释该函数,则确实会发生这种情况。 “instance”变量的类型也是正确推断的,尝试访问下面一行的“BROKEN”字段也是一个错误。
我在这里遗漏了什么吗?有没有办法让这个工作无需在任何地方添加冗余类型定义?
答案 0 :(得分:1)
它被接受,因为它是兼容的。
假设您定义了一个扩展IRet2
并添加字段IReturned
的接口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
的推断类型。