TypeScript多余字段检查和类型推断错误

时间:2016-09-01 08:38:44

标签: typescript type-inference

在类型推断方面,似乎我遇到了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”字段也是一个错误。

我在这里遗漏了什么吗?有没有办法让这个工作无需在任何地方添加冗余类型定义?

1 个答案:

答案 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的推断类型。