TypeScript函数类型未强制执行与返回类型相同的严格性

7

我试图定义一个返回类型为Object的函数类型,以强制实现它的函数返回与返回类型中定义的确切对象属性相同的对象。

然而编译器并不严格要求返回的对象,允许存在未在返回对象类型中定义的额外属性。

interface Obj {
  foo: string;
}

type Func = () => Obj;

const fn: Func = () => {
  return {
    foo: 'bar',
    blah: '', // compiler does not show an error
  };
};

相反,如果在 fn 函数中指定了返回类型为 Obj,则编译器会显示一个错误。

在TS playground中查看示例

interface Obj {
  foo: string;
}

const fn = (): Obj => {
  return {
    foo: 'bar',
    blah: '', // compiler shows an error
  };
};
TS Playground上的示例代码可以解释为什么TypeScript会以不同的方式处理这些情况吗?是否有一种方法可以在使用函数类型的同时保持返回类型的严格性?
1个回答

5
在第一个示例中,匿名函数的返回类型动态定义为: { foo: string; blah: string; }。此类型与类型Obj兼容,因为它具有Obj的所有必需属性(还有更多,但已足够被视为兼容,因为“结构化类型是一种基于成员关系的类型关系”,来源于https://www.typescriptlang.org/docs/handbook/type-compatibility.html)。
最终,类型Func与匿名函数的隐式定义类型() => { foo: string; blah: string; }兼容,因此发生“隐式转换”并进行编译。
在第二个示例中,签名强制执行匿名函数本身的返回类型,因此返回的对象是一个字面量,应该完全是类型Obj。因此,由于没有兼容性检查,正如您无法执行以下操作:let obj: Obj = { foo:'bar', blah:'' },此代码无法编译,因为它的类型明确定义。
干杯!

2
为什么第二个例子中没有兼容性检查?结构化类型应该随处适用,不是吗? - yazfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接