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
});