Typescript 接口在用作函数的返回类型时允许使用额外的属性

Typescript 接口在用作函数的返回类型时允许使用额外的属性,typescript,Typescript,当通过类型将接口指定为函数的返回时,接口似乎接受额外的属性 例如,如果我有一个名为MyInterface的空接口,则函数的类型:typemyfunction=()=>MyInterface和函数const myFunction:myFunction=()=>({foo:'bar'})它不会为foo属性抛出任何错误 以下是一些例子: //没有“年龄”属性 界面人{ 名称:字符串; } 常量人类:人类={ 名称:“”, 年龄:0//错误 } 输入HumanCreator=(姓名:Human['nam

当通过类型将接口指定为函数的返回时,接口似乎接受额外的属性

例如,如果我有一个名为
MyInterface
的空接口,则函数的类型:
typemyfunction=()=>MyInterface和函数
const myFunction:myFunction=()=>({foo:'bar'})
它不会为
foo
属性抛出任何错误

以下是一些例子:

//没有“年龄”属性
界面人{
名称:字符串;
}
常量人类:人类={
名称:“”,
年龄:0//错误
}
输入HumanCreator=(姓名:Human['name'],年龄:number)=>Human;
const humanCreator:humanCreator=(姓名、年龄)=>({
名称
年龄//没有错。为什么?
});
const humanCreatorr:HumanCreator=(姓名、年龄):HumanCreator=>({
名称
年龄//错误
});
const humancreatorr=():Human=>({
名称:“”,
年龄:0//错误
});
为什么当我用
humanCreator
键入变量
humanCreator
时,它不关心是否向返回的对象添加额外属性

当通过类型将接口指定为函数的返回时,接口似乎接受额外的属性

通常,TypeScript使用,因此可以将具有附加属性的对象指定给
人员接口

const lui = {
  name: "Lui",
  age: 40
}

const human: Human = lui // works, 
您可以将
lui
分配给类型为
human
的变量
human
,因为
typeof lui
是一个子类型,因此具有相同/兼容的属性成员

此规则的一个例外情况是“新创建的对象文字”,其目的是作为开发人员辅助,并禁止添加额外的属性。这里的一般思想是,当您定义一个没有其他间接寻址(访问变量等以获取该对象值)的直接对象文本时,您确切地知道您想要什么属性

过多的属性检查需要在处理新对象文字的变量、属性或函数上紧接着进行显式类型注释,才能正常工作。否则,对象文字类型不再被视为“新鲜”(其类型为)。让我们检查一下你的例子来说明这个概念

const humanCreator: HumanCreator = (name, age) => ({
  name,
  age // No error. Why?
});
您可以将其视为类型兼容函数对类型为
HumanCreator
的变量的赋值。编译器查看函数表达式
(name,age)=>({name,age})
,推断参数类型并确保其返回类型与变量类型兼容。实际上-
{name:string;age:number}
返回类型可分配给
Human
(结构化类型)

这些情况是不同的,因为您可以立即使用
Human
返回类型对函数进行注释。编译器所需的返回类型没有类型推断tl;dr要启用多余的属性检查,请尽可能近距离地为对象文本注释一个显式类型

更多链接


哇,现在清楚多了。非常感谢您的详细回答!请参阅以了解有关此的更多信息
const humanCreatorr: HumanCreator = (name, age): Human => ({
  name,
  age // Error
});

const humanCreatorrr = (): Human => ({
  name: '',
  age: 0 // Error
});