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

TypeScript excess field checking and type inference error

当涉及到类型推断时,我似乎 运行 陷入了 TS 编译器的一个奇怪的边缘情况。下面的代码(带有注释行)应该(我相信)会产生编译错误,但实际上不会。

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

理想情况下应该发生的是工厂函数的 return 类型被推断为 IReturned,这意味着它是 return 具有多余字段的对象文字的编译错误,因此设置"BROKEN" 属性 应该无效。

如果函数被显式注释为 IReturned 作为其 returned 类型,这确实会发生。 "instance" 变量的类型也被正确推断,尝试访问下面一行的 "BROKEN" 字段也是一个错误。

我是不是漏掉了什么?有没有一种方法可以使它工作而不必在任何地方添加冗余类型定义?

因为兼容所以接受了

假设您定义了一个扩展 IReturned 的接口 IRet2 并添加了一个字段 BROKEN。因为接口 IRet2 扩展了 IReturned,它对 return 类型 IRet2 的对象有效,你必须 return 一个 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.

的推断类型