type asserting函数返回值与其签名类型的typing the function返回值之间有什么区别(如果有)?假设我们只在谈论带有单个return语句的简单函数。
interface Foo { foo: number }
interface Bar { bar: Foo[] }
// type assertion
function buzz(foo: Foo) {
return { bar: [] } as Bar;
}
// typing the function
function fuzz(foo: Foo): Bar {
return { bar: [] };
}
请参见示例TypeScript playground。
答案 0 :(得分:0)
在这种情况下,没有一个,因为推断仅将fuzz
和buzz
都键入为(foo: Foo) => Bar
。您可以看到差异,即,如果您尝试在最新的收益之前添加另一个if
条件,则收益不同:
interface Foo { foo: number }
interface Bar { bar: Foo[] }
// type assertion
function buzz(foo: Foo) {
// This changes the return type of `buzz` to Bar | object
if (foo.foo > 10) return {};
return { bar: [] } as Bar;
}
// typing the function
function fuzz(foo: Foo): Bar {
// This is a type error, since `fuzz` expects a `Bar` as return type
if (foo.foo > 10) return {};
return { bar: [] };
}
在第一种情况下,改编buzz
。在第二篇中,fuzz
代码引发错误。
这里的区别是:强制Bar
作为返回类型的意思是:“我正在声明输出,所以谁将实现这一需要尊重输出,Bar”。
使用as Bar
作为返回类型表示:“好吧,现在返回一个对象,但是我确定输出应该是Bar。无论如何,只要此更改,我们就应该相应地更改返回类型。”