打字稿返回类型(布尔值 vs 'is' vs <nothing>)差异? [复制]

Posted

技术标签:

【中文标题】打字稿返回类型(布尔值 vs \'is\' vs <nothing>)差异? [复制]【英文标题】:Typescript return types (boolean vs 'is' vs <nothing>) differences? [duplicate]打字稿返回类型(布尔值 vs 'is' vs <nothing>)差异? [复制] 【发布时间】:2021-03-17 17:10:07 【问题描述】:

我看到了这篇关于同样问题的帖子: What does the `is` keyword do in typescript? 他们在哪里询问 boolean 和 'type is ' 之间的区别。虽然我不明白最佳答案的英语不好,但仍然需要一些帮助来理解它。

功能有什么区别

foo(type: any): type is number 

和:

foo(type: any): boolean

和:

foo(type: any)

?

谢谢

【问题讨论】:

我认为正确的做法是清理另一个问题的答案或添加它。我尝试稍微提高英语水平,并在顶部提供了一个文档链接,这可能会给你一个更规范的答案。 【参考方案1】:

这意味着您的函数需要一个布尔值作为参数:

function foo(arg: boolean)
  if(typeof arg != 'boolean')
    Throw 'type error'
   else 
    return arg
  

这意味着您的函数将返回一个布尔值:

function foo(): boolean 
  return true;


let value: string;

value = foo();

//Type Error, variable value (type 'string') not assignable to type 'boolean'

【讨论】:

【参考方案2】:

当你这样做时

foo(type: any)

这只是一个简单的函数定义。如果可以,TS 会推断返回值的类型。


foo(type: any): boolean

是一个函数定义,添加了来自foo 的返回值应该是布尔值的断言。 (如果 TS 推断返回值不是布尔值,它会抛出错误。通常,这不是必需的。)


foo(type: any): type is number 

与上述两种完全不同。它允许foo调用者 缩小传递表达式的类型。这称为类型保护。例如,使用最后一个实现,您可以这样做:

const something = await apiCall();
// something is unknown
if (foo(something)) 
  // TS can now infer that `something` is a number
  // so you can call number methods on it
  console.log(something.toFixed(2));
 else 
  // TS has inferred that `something` is not a number

您只能使用 : type is number 类型的语法来执行上述操作 - foo 的其他两个定义将不允许在调用者中缩小范围。

【讨论】:

对于最后一个例子,那为什么不直接使用 Promise 呢?此外,如果函数是异步的并且您必须“等待”它才能完成,那么您应该已经拥有变量“某物”的类型,对吗?另外,仅使用“instanceof”检查参数的类型有什么区别? 这只是一个例子——假设apiCall 返回Promise&lt;unknown&gt;,并且您想将其类型缩小为一个数字,而不是一个包含错误消息的字符串。 instanceof 不检查原始类型,但 typeof 会。是的,如果你只是想看看某个东西是否是一个特定的原语,使用 typeof 比使用类型保护更有意义 - 但类型保护更灵活,可用于缩小任何范围,将逻辑抽象为函数,而不是内联。 太好了,帮了大忙。当我写“instanceof”时,我不小心想到了 Java,但解释是有道理的。谢谢!

以上是关于打字稿返回类型(布尔值 vs 'is' vs <nothing>)差异? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

打字稿通用承诺返回类型

如何覆盖打字稿中的属性?

打字稿:你如何用布尔或回调函数定义联合类型?

如何调试打字稿代码,在 vscode/vs2015 中使用 webpack 捆绑

VS 2015 ASP.NET 4 MVC 5 中的打字稿 - 设置和选择的工作组合是啥?

VS Code:在保存文件时观看打字稿