返回值的类型断言与键入函数的返回类型

时间:2020-04-23 11:18:53

标签: typescript typescript-typings

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

1 个答案:

答案 0 :(得分:0)

在这种情况下,没有一个,因为推断仅将fuzzbuzz都键入为(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。无论如何,只要此更改,我们就应该相应地更改返回类型。”