Typescript 在函数中,什么';内联返回类型与单独类型定义中定义的返回类型之间的区别是什么?

Typescript 在函数中,什么';内联返回类型与单独类型定义中定义的返回类型之间的区别是什么?,typescript,async-await,type-definition,Typescript,Async Await,Type Definition,当我内联函数的返回值类型时,如果我在单独的类型定义中定义它,就会出现不一致的行为 例如: 接口Foo{ 酒吧:字符串; } 输入foore=()=>Foo; const foo1:foore=()=>{//它知道`.bar`应该是字符串 返回{ 酒吧:123, }; } //在单独的类型定义中设置的返回类型 常量foo2:Fooer=()=>{ 返回{ foo:123,//它不会抱怨其他属性 酒吧:“zzz”, }; } //内联(重复)返回类型 常量foo3:Fooer=():Foo=>{ 返

当我内联函数的返回值类型时,如果我在单独的类型定义中定义它,就会出现不一致的行为

例如:

接口Foo{
酒吧:字符串;
}
输入foore=()=>Foo;
const foo1:foore=()=>{//它知道`.bar`应该是字符串
返回{
酒吧:123,
};
}
//在单独的类型定义中设置的返回类型
常量foo2:Fooer=()=>{
返回{
foo:123,//它不会抱怨其他属性
酒吧:“zzz”,
};
}
//内联(重复)返回类型
常量foo3:Fooer=():Foo=>{
返回{
foo:123,//现在它确实。。。
酒吧:“zzz”,
};
}

我希望
foo2
foo3
具有相同的行为(我个人希望两者显示相同的错误,或者至少是一致的)


我错过了什么?这两种方法的区别是什么?

这里发生的事情是TypeScript的“duck typing”的结果。基本上,foo2中的返回类型有一个字符串形式的
bar
字段这一事实意味着函数有一个签名
()=>Promise
,由于duck类型的原因,可以将该签名分配给
foooer
类型的
foo2
变量


但是,在foo3中,可以将类型检查视为直接应用于返回类型,而不是应用于整个函数。因此,您会看到错误
对象文字可能只指定已知属性,而类型“foo”中不存在“foo”。
因为类型检查是在对象文字上执行的,它还有一个额外的要求,即当您给它显式类型时,它不能指定未知属性。

这里发生的事情是TypeScript的“duck typing”的结果。基本上,foo2中的返回类型有一个字符串形式的
bar
字段这一事实意味着函数有一个签名
()=>Promise
,由于duck类型的原因,可以将该签名分配给
foooer
类型的
foo2
变量


但是,在foo3中,可以将类型检查视为直接应用于返回类型,而不是应用于整个函数。因此,您会看到错误
对象文字可能只指定已知属性,而类型“foo”中不存在“foo”。
因为类型检查是在对象文字上执行的,它还有一个额外的要求,即当您为它指定显式类型时,它不能指定未知属性。

这与TypeScript如何处理类型文本有关,而与函数是否异步无关-如果这些函数是常规函数,则行为将是相同的


通常,TypeScript允许对象中存在多余的属性。如果一个对象具有所有必需的属性,那么其余的属性就无关紧要了。例外情况与您发现的情况基本相同:类型文本和显式定义的返回类型。

这与TypeScript如何处理类型文本有关,而与函数是否异步无关-如果这些是常规函数,行为将是相同的


通常,TypeScript允许对象中存在多余的属性。如果一个对象具有所有必需的属性,那么其余的属性就无关紧要了。这些异常与您发现的非常相似:类型文本和显式定义的返回类型。

很有趣。但对我来说,这仍然是一种不受欢迎的行为(有没有办法确保
foore
中的返回类型不允许使用其他参数?谢谢你的回复,顺便说一下:)很有趣。但对我来说,这仍然是一种不受欢迎的行为(有没有办法确保
foore
中的返回类型不允许附加参数?谢谢您的回复,顺便问一下:)有没有办法确保根据
foore
中定义的返回类型进行更严格的检查(或者,有没有办法使
foo2
触发错误)?使foo2触发错误的方法基本上就是使用foo3。您还可以显式地在foo2的主体内创建一个类型为
Foo
的变量,并将对象文本分配给该变量。然后将返回该变量。这样,当您将对象文字分配给该变量时,您将看到类型错误。我明白了。:/这迫使开发人员同时导入
foore
Foo
(在我的实际案例中,它们位于一个单独的模块中,并在多个地方重复使用,我试图使开发人员获得适当的类型检查变得尽可能简单)。非常感谢您的帮助!:)我有没有办法确保基于
foore
中定义的返回类型进行更严格的检查(或者,有没有办法使
foo2
触发错误)?使foo2触发错误的方法基本上就是使用foo3。您还可以显式地在foo2的主体内创建一个类型为
Foo
的变量,并将对象文本分配给该变量。然后将返回该变量。这样,当您将对象文字分配给该变量时,您将看到类型错误。我明白了。:/这迫使开发人员同时导入
foore
Foo
(在我的实际案例中,它们位于一个单独的模块中,并在多个地方重复使用,我试图使开发人员获得适当的类型检查变得尽可能简单)。非常感谢您的帮助!:)