打字稿返回类型(布尔值 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
的其他两个定义将不允许在调用者中缩小范围。
【讨论】:
对于最后一个例子,那为什么不直接使用 PromiseapiCall
返回Promise<unknown>
,并且您想将其类型缩小为一个数字,而不是一个包含错误消息的字符串。 instanceof
不检查原始类型,但 typeof
会。是的,如果你只是想看看某个东西是否是一个特定的原语,使用 typeof
比使用类型保护更有意义 - 但类型保护更灵活,可用于缩小任何范围,将逻辑抽象为函数,而不是内联。
太好了,帮了大忙。当我写“instanceof”时,我不小心想到了 Java,但解释是有道理的。谢谢!以上是关于打字稿返回类型(布尔值 vs 'is' vs <nothing>)差异? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何调试打字稿代码,在 vscode/vs2015 中使用 webpack 捆绑