社区首页 >问答首页 >“函数表达式,没有返回类型注释,在添加void操作时隐式地具有‘任意’返回类型”。

“函数表达式,没有返回类型注释,在添加void操作时隐式地具有‘任意’返回类型”。
EN

Stack Overflow用户
提问于 2022-01-10 00:59:20
回答 2查看 11.5K关注 0票数 3

我在TypeScript上有一个奇怪的问题。我最近了解了void ...操作符,因为我需要应用它,这样eslint就不会报告no-floating-promises。然而,这个特别的片段不知怎么地引起了一个问题,我不能在TypeScript游乐场上重现。

代码语言:javascript
代码运行次数:0
复制
class A {

  async a() {}

  async onTickAsync(repeat: boolean) {
    try {
      await this.a();
    } catch(e) {
      console.error(e);
    } finally {
      if (repeat) {
        window.setTimeout(() => void this.onTickAsync(true), 200);
      }
    }
  }

}

VS代码将报告此错误:

TS7011:函数表达式,它没有返回类型注释,隐式地具有“任意”返回类型。

然而,这个问题在TS游乐场上是不可复制的。VS Code和游乐场都在使用TypeScript 4.5.4。这是我的tsconfig.json

代码语言:javascript
代码运行次数:0
复制
{
    "compileOnSave": true,
    "compilerOptions": {
        "noImplicitAny": true,
        "noEmitOnError": true,
        "sourceMap": true,
        "target": "ESNext",
        "module": "ESNext"
    },
    "exclude": [
        "node_modules"
    ]
}

我理解它可以通过添加: void返回类型或删除void操作或删除noImplicitAny来修复。

代码语言:javascript
代码运行次数:0
复制
window.setTimeout((): void => void this.onTickAsync(true), 200);

我想问:是什么导致了错误?为什么它只发生在我的IDE/本地而不是操场上?

当然,这不仅仅是因为VS代码,我还在一个单独的终端上运行了tsc --versiontsc

tsc --showConfig输出:

代码语言:javascript
代码运行次数:0
复制
PS C:\Users\lukev\Downloads\Temp> tsc --showConfig
{
    "compilerOptions": {
        "noImplicitAny": true,
        "noEmitOnError": true,
        "sourceMap": true,
        "target": "esnext",
        "module": "esnext"
    },
    "files": [
        "./test.ts"
    ],
    "exclude": [
        "node_modules"
    ],
    "compileOnSave": true
}

同样有趣的是,它不会发生在其他功能上。例如,这不会产生任何错误。这似乎与window.setTimeout有关。例如,我发现Function类型和() => void之间有一些不同):

代码语言:javascript
代码运行次数:0
复制
class A {

  doSomething1(_: Function) { }
  doSomething2(_: () => any) { }
  doSomething3(_: () => void) { }

  async a() { }

  async onTickAsync(repeat: boolean) {
    // Only this one produces error
    this.doSomething1(() => void this.onTickAsync(true));
    this.doSomething2(() => void this.onTickAsync(true));
    this.doSomething3(() => void this.onTickAsync(true));
  }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-10 12:34:49

有关权威的答案,请参见微软/打字稿#36651

您的问题是您已经启用了编译器选项,但是还没有启用编译器选项。您可以在TypeScript游乐场并复制你的问题中设置这些选项。

旁白:请注意,--strictNullChecks编译器特性系列的一部分,通常建议将其作为事实上的类型安全“标准”级别的一部分。您并不是真正地询问应该使用哪些编译器选项,但是请注意,如果您使用了一组不常见的编译器选项,那么您更有可能遇到一般TypeScript社区并不熟悉的编译器行为。好了,够了。

所以我们知道如何复制,但还没有明确地回答为什么这里有一个错误。现在就这么做吧。启用--strictNullChecks后,光学器生成类型值。但是如果禁用了--strictNullChecks,就没有真正的undefined类型,而void运算符会生成一个类型值。除非显式地将一个类型称为注解,否则您将在--noImplicitAny下得到一个错误

代码语言:javascript
代码运行次数:0
复制
// with --strictNullChecks disabled

() => void 0; // error!
// Function expression, which lacks return-type annotation, 
// implicitly has an 'any' return type.

(): undefined => void 0; // okay
//^^^^^^^^^^^ <-- arrow function return type annotation

正如您所看到的,如果void操作符的返回类型被赋予了语境类型,您也可以消除错误。

代码语言:javascript
代码运行次数:0
复制
function foo(cb: () => any) { }
foo(() => void 0); // okay, void 0 is contextually typed as any

请注意,Function接口有点奇怪,没有真正的呼叫签名,请参阅微软/打字稿#20007,因此不能提供上下文类型:

代码语言:javascript
代码运行次数:0
复制
function bar(cb: Function) { }
bar(() => void 0); // implicit any error!

操场链接到代码

票数 2
EN

Stack Overflow用户

发布于 2022-01-10 01:19:33

我可以重现您的问题,尽管我无法回答为什么会发生这种情况,但是您可以通过省略运算符并将catch方法链接到满足ESLint的承诺来修复编译器错误:

代码语言:javascript
代码运行次数:0
复制
// before
window.setTimeout(() => void this.onTickAsync(true), 200);

// after
window.setTimeout(() => this.onTickAsync(true).catch(() => {}), 200);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70649907

复制
相关文章
腾讯云TDP-使用netdata的nodejs环境 snmp插件 监控mikrotik设备带宽
腾讯云TDP-使用netdata的nodejs环境 snmp插件 监控mikrotik设备带宽
root0day
2022/04/24
1.9K0
腾讯云TDP-使用netdata的nodejs环境 snmp插件 监控mikrotik设备带宽
将MySQL复制限制为基于行的事件
在MySQL 8.0.18上进行的后续工作中,我们引入了对从服务器的回放线程进行权限检查功能,在本文中,我们将介绍一项新功能,可以进一步提高安全复制数据的能力,用户可以将复制流限制为仅基于行的事件。
MySQLSE
2020/09/28
9660
将MySQL复制限制为基于行的事件
介绍一款将屏幕录制为gif的软件
在写博客的过程中,发现很多时候需要录制屏幕并制作gif以便展示给大家。例如在这篇文章中,就需要将git的工作过程用动画的形式进行展示。在这里向大家介绍一款录制屏幕制作gif的软件。
大神带我来搬砖
2019/05/15
6920
使用MikroTik产品配置我们的上网环境①
首先我们下载routeros的图形化配置工具winbox https://mikrotik.com/download 目前最新版本为3.18 并且只有exe版本,如果没有windows的同学请先安装wine来启动此程序。
海哥@开发
2022/04/06
2.2K0
使用MikroTik产品配置我们的上网环境①
如何使用文件传输协议ftp,教你使用文件传输协议命令行
FTP是文件传输协议的缩写。顾名思义,FTP用于在网络上的计算机之间传输文件。您可以使用文件传输协议在计算机帐户之间交换文件,在帐户和台式计算机之间传输文件或访问在线软件档案。但是请记住,许多文件传输协议站点已被大量使用,并且在连接之前需要进行多次尝试。
镭速
2023/04/10
9800
如何使用nload实时监控网络带宽
在基于CentOS/RHEL的系统上首先安装epel软件源,可以轻松地安装nload工具。
用户1685462
2021/09/05
7670
QT应用编程: 基于UDP协议设计的大文件传输软件
功能介绍: 软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件; 服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。
DS小龙哥
2022/01/07
2.7K0
QT应用编程: 基于UDP协议设计的大文件传输软件
Lighthouse Router (二):在腾讯云轻量应用服务器上使用 MikroTik RouterOS 在数据中心之间配置隧道
  RouterOS 是由 MikroTik 公司开发的基于 Linux 内核的路由操作系统,是目前功能较强、应用较广的一款软路由系统,适用于中小企事业单位、网吧、宾馆和运营商。通过该软件可以将标准的 PC 电脑变成专业路由器,在软件的开发和应用上可以不断地更新和发展,使其功能在不断增强和完善。特别在无线、认证、策略路由、带宽控制和防火墙过滤等功能上有着非常突出的功能。   本文旨在介绍在腾讯云轻量应用服务器上使用 MikroTik RouterOS CHR 6.48.1 在腾讯云新加坡数据中心和 AWS 新加坡数据中心的两台服务器上配置隧道。   需要注意的是,本文所操作的服务器均位于新加坡共和国,服务器之间的加密数据通信均属新加坡共和国国内通信交换,符合相关法律法规。   本文为《Lighthouse Router (一):在腾讯云轻量应用服务器上安装 MikroTik RouterOS 并配置简单的端口转发》一文的续集。若您尚未了解 MikroTik RouterOS 的安装和配置,请移步 https://www.idc.moe/archives/qcloud-Lighthouse-RouterOS-1.html 开始您的第一步。
Nyarime
2021/12/14
3.6K0
Lighthouse Router (二):在腾讯云轻量应用服务器上使用 MikroTik RouterOS 在数据中心之间配置隧道
如何使用nload实时监控网络带宽
nload是一个可实时监视网络流量和带宽使用情况的工具。它可以帮助你使用图表监输入和输出的流量,并提供其他信息,例如传输的数据总量和最小/最大网络使用率。
用户1685462
2021/09/05
8380
如何使用nload实时监控网络带宽
在基于CentOS/RHEL的系统上首先安装epel软件源,可以轻松地安装nload工具。 安装
用户5005176
2021/09/08
1.2K0
使用MikroTik产品-解决NS游戏联机问题②
在上一次我们聊了基础的网络配置已经可以正常上网了,但在日常使用中你可能还会遇到以下几个问题:
海哥@开发
2022/04/06
1.5K0
使用MikroTik产品-解决NS游戏联机问题②
P2P如何将视频直播带宽降低75%?
实时直播经过去年的千播大战后已经成为互联网应用的标配技术,但直播平台的成本却一直居高不下,各个平台除了挖主播、挖网红以外,其背后高额的带宽费用也是他们最大的一块成本。
LiveVideoStack
2021/09/02
9250
P2P如何将视频直播带宽降低75%?
Sublime text3 将代码复制为RTF或HTML的方法
添加下面url: https://github.com/n1k0/SublimeHighlight/tree/python3
飞奔去旅行
2019/06/13
1.8K0
Sublime text3 将代码复制为RTF或HTML的方法
使用MikroTik产品-关于网络加速的一些问题③
上次的网游加速文章发表后,有人留言问了机房的选择问题,这个不是一句两句能说明白了,我单开文章进行一下说明。
海哥@开发
2022/04/06
1.2K0
使用MikroTik产品-关于网络加速的一些问题③
Lighthouse Router (2): 在腾讯云轻量上使用RouterOS在数据中心间建立隧道
RouterOS 是由 MikroTik 公司开发的基于 Linux 内核的路由操作系统,是目前功能较强、应用较广的一款软路由系统,适用于中小企事业单位、网吧、宾馆和运营商。通过该软件可以将标准的 PC 电脑变成专业路由器,在软件的开发和应用上可以不断地更新和发展,使其功能在不断增强和完善。特别在无线、认证、策略路由、带宽控制和防火墙过滤等功能上有着非常突出的功能。
iks
2021/12/12
2.8K0
Lighthouse Router (2): 在腾讯云轻量上使用RouterOS在数据中心间建立隧道
MikroTik RouterOS 产品初识
MikroTik这家公司部位于拉脱维亚,97年开发出RouterOS系统,02年开始销售自有硬件。我从2010年使用到现在才发现RouterOS真是最好用的路由系统,高灵活、可配置的系统。可以跑在x86、mips、arm、tile各种CPU上。如果只是为了试用或者不怕费电,完全可以跑在x86架构老主板上。但是我这篇文章主要介绍的是自家硬件也就是RouterBoard。我们来看看ROS的部分优点:
海哥@开发
2022/04/06
3.3K0
MikroTik RouterOS 产品初识
使用iftop查看实时使用带宽
介绍给大家一个软件,用来查看实时带宽,通用于包括阿里云在内的几乎所有Linux操作系统,首页我们要安装它。相关命令如下: #如果你是centos系统,执行: yum install iftop #如果你是debian/ubuntu系统,执行: apt-get install iftop 观看一下提示,是否安装成功,或者,直接执行iftop,看是否运行来判断是否安装成功。如果安装不成功,可以使用以下命令,编译安装执行,通用于centos操作系统: yum -y install flex byacc libpc
用户1700948
2018/05/16
3.5K0
P2P技术如何将实时视频直播带宽降低75%?
实时视频直播经过去年的千播大战后已经成为互联网应用的标配技术,但直播平台的成本却一直居高不下,各个平台除了挖主播、挖网红以外,其背后高额的带宽费用也是他们最大的一块成本。
JackJiang
2018/08/29
5.5K0
为什么 DNS 协议使用 UDP?只使用了 UDP 吗?
为什么 DNS 协议使用 UDP 呢?这个问题可能大部分同学在各种博客或者面试过程中都或多或少遇见过,张口就来,UDP 快啊,DNS 使用 UDP 使得打开网页速度更快。
飞天小牛肉
2021/04/26
6.3K0
为什么 DNS 协议使用 UDP?只使用了 UDP 吗?
点击加载更多

相似问题

园区网络的Mikrotik带宽整形

127

UDP文件传输-是的,UDP

51

UDP文件传输Python

12

MikroTik热点试用用户带宽限制

12

部分udp文件传输

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文