TypeScript 忽略了 foo:() => void { return 1 },为什么? [重复]

问题描述 投票:0回答:1

即使在类型注释函数返回之后,以下匿名函数在返回数字时也会被 TS 忽略

const doSomething: () => void = () => {
  console.log("Hello World");
  return 5;
};

doSomething()

enter image description here

在屏幕截图中,观察没有发现红色波浪线错误 提示还显示

doSomething
返回 void ,即使它返回一个数字

通常(据我所知)该函数返回一个数字类型,但我已注释为 void,所以我希望它会抛出错误。为什么不是这样?

注意:输出为

Hello
5

我的猜测是箭头函数的行为很特殊,在某种程度上

  1. () => ()
    返回带有隐式返回的表达式(值)
  2. () => { return 0 }
    有利于显式返回,(使用“return”关键字)

后者的行为,其中使用箭头函数内的“return”语句显式返回值会覆盖 TS 中的类型检查。

这是一个公平的评估吗,因为我想不出一个逻辑答案来解释这段代码为何有效。

typescript
1个回答
1
投票

void
并不意味着该函数不返回任何内容,而是意味着该函数的返回值没有意义,不应该使用。因此,即使您将
doSomething
常量键入为
() => void
,也可以为其分配
() => number
函数(或返回其他任何内容的函数)。如果您想强制只能将函数分配给返回
undefined
的常量(如果没有明确的
return ___
语句,则函数在调用时会返回该常量),您可以使用
() => undefined

如果您使用函数声明而不是对常量赋值,TypeScript 也会抱怨:

function doSomething(): void {
    console.log("Hello World");
    return 5;
}

它在那里抱怨,因为它在那里应用了更严格的检查,而不是将函数分配给函数类型变量(和常量)。

© www.soinside.com 2019 - 2024. All rights reserved.