Typescript:重写超类方法而不需要知道超类方法签名

2023-12-05

以下是我如何可靠地重写 vanilla JS 中的方法,而不关心名称或参数数量或返回值:

import EventEmitter from 'events'

// console.log event + arguments every time this emitter emits anything.
// Just an example.  
class LogEmitter extends EventEmitter {
  emit(...args) {
    console.log('emit', ...args)
    return super.emit(...args)
  }
}

但在 TypeScript 中,我听到了抱怨:

import { EventEmitter } from 'events'

class LogEmitter extends EventEmitter {
  emit(...args) {                // Rest Parameter 'args' implicitly has an any[] type
    console.log('emit', ...args)
    return super.emit(...args)  // Expected at least 1 arguments, but got 0 or more.
  }
}

我不知道如何告诉 TypeScript 这没问题。我不想知道有关我要重写的方法的签名的任何信息,只需打印您传递的任何参数即可。意味着如果/当超类签名发生更改时,我不必更新我的签名,理想情况下,我将有一种方法来键入它,该方法适用于我重写的所有方法,也许有一个例外,告诉它要复制哪个方法名称签名来自.

就像是:

的类型...args应该是任何Parameters are to super.emit

但我的新手尝试这不是有效的语法:

import { EventEmitter } from 'events'

class LogEmitter extends EventEmitter {
  emit(...args: Parameters<super.emit>) {  // 'super' can only be referenced in members of derived classes or object literal expressions.
    console.log('emit', ...args)
    return super.emit(...args)
  }
}

我的解决方法是any所需的第一个参数:

import { EventEmitter } from 'events'

class LogEmitter extends EventEmitter {
  emit(type: any, ...args: any[]) {
    console.log('emit', type, ...args)
    return super.emit(type, ...args)
  }
}

但我认为这更像是修补症状,因为现在此类报告的签名不太准确。我觉得有一个更好的解决方案可以提供的正确签名emit自动,无需我复制它super.emit.

我怎样才能在不知道的情况下完美地输入这个内容anything关于签名super.emit?


不幸的是,Typescript 没有(从 TS4.1 开始)上下文类型子类成员由超类(或实现的接口)中的类似成员组成。有很多类似的 GitHub 问题,但我认为针对这种特殊情况的典型问题是微软/TypeScript#23911。现在,你能做的就是“修补症状”:

作为解决方法,如果您想引用超类,则需要通过名称显式执行此操作(EventEmitter)而不是由super,你可以使用查找类型得到emit method:

class LogEmitter extends EventEmitter {
  emit(...args: Parameters<EventEmitter['emit']>) {
    console.log('emit', ...args)
    return super.emit(...args)
  }
}

Playground 代码链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript:重写超类方法而不需要知道超类方法签名 的相关文章

随机推荐

  • MySQL 用户定义的纬度经度语法函数

    我创建了一个 MySQL 函数来确定一组纬度和经度坐标是否在另一组纬度和经度坐标的特定范围内 但是 该函数给了我一个语法错误 因此我无法测试它是否正常工作 任何有助于找出导致错误的原因的帮助将不胜感激 该函数及其描述如下 它的工作原理是将起
  • RxAndroidBle 多种特性通知和读/写

    我在设置多个特征的通知时遇到问题 我已经查看了文档 许多示例仅涵盖了非常精细的情况 我的用例如下 1 扫描设备 2 用户选择要连接的设备 连接持续到应用程序关闭 3 订阅多种特性的通知 4 一次读 写单个特征 在某些情况下一次读 写多个特征
  • 我无法让程序正确读取输入文件中的值(二维数组)

    我的程序错误地读取了该值 当我尝试从此文件中获取值时 存在同样的问题 14 14 8 0 4 16 2 0 1 7 7 4 7 0 23 0 44 290 350 16 16 10 0 5 17 2 2 1 8 8 5 4 0 27 0 5
  • 解析 Amazon MWS Scratchpad 响应

    我正在尝试解析来自亚马逊的 xml 文件 但发现困难 我正在使用 simplexml load string xml simplexml load string 这里是我的 xml 但当我这样做时 echo xml gt GetMatchi
  • 将 CALayer 子层压平为一层

    在我的应用程序中 我有一个根层 以及许多作为 rootLayer 的子层的图像 我想将 rootLayer 的所有子层展平为一个没有任何子层的层 图像 我认为我应该通过在核心图形上下文中绘制所有子图层来做到这一点 但我不知道该怎么做 我希望
  • Linux 如何通过错误号获取错误描述

    在 Linux 中 特别是我有 Ubuntu 14 如果某个程序因错误而终止 我可以通过以下方式获取数字错误代码 多变的 failing app echo 然而数字本身并不能告诉我太多信息 如何获取错误名称和描述 有一个错误列表 man e
  • ”' aria-label='使用 Pandas Dataframe 的半正弦距离计算器“无法将系列转换为 ”'> 使用 Pandas Dataframe 的半正弦距离计算器“无法将系列转换为

    我尝试在 Panda Dataframe 上使用半正矢计算 from math import radians cos sin asin sqrt def haversine lon1 lat1 lon2 lat2 convert decim
  • 如何制作 jQuery 倒计时

    我想要一个 jQuery 倒计时 页面下载完成后开始计数 数到 0 后重定向到一个 url 我怎样才能做到这一点 我想我应该稍微分解一下并提供一些既可以倒计时又可以重定向的东西 毕竟 明天您可能想要倒计时并操作 DOM 因此 我提出了以下
  • BottomNavigationView 与导航图再次加载片段

    我在用BottomNavigationView with nav graph下面是我的代码 InMainActivity class navController Navigation findNavController this R id
  • 当 'type = "norm" 时如何计算 ggplot stat_ellipse() 的面积?

    类似这个问题 当 type norm 时 有什么方法可以计算这个椭圆的面积吗 默认为type t type norm 显示不同的椭圆 因为它假设多元正态分布而不是多元 t 分布 这是代码和情节 使用与其他帖子类似的代码 library gg
  • 页面加载后jquery加载div

    实际上我正在寻找的加载是首先加载页面 然后加载包含大量数据的 div 所以 我想首先加载主页 然后使用 jQuery 函数加载正文 div 内容 但有一些延迟 实现这个的简单方法是什么 div div navigation div div
  • 如何使用 Lombok 访问 getter 和 setter 方法? [复制]

    这个问题在这里已经有答案了 我已经在我的项目中添加了 Lombok maven 存储库 并成功使用了 Lombok 注释 我尝试从另一个类访问 setter 和 getter 方法 但无法访问这些方法 我正在使用 spring Boot 版
  • SQL Server - 有没有办法批量解决排序规则冲突

    我们遇到的情况是 开发和生产 SQL Server 之间的数据库 表和某些列的排序规则不同 这对开发造成了严重破坏 事情会在开发上工作 然后由于升级时的排序规则冲突而中断 数据和结构将从产品复制到开发 这又会因为冲突等而破坏开发上的查询 我
  • 执行Python程序

    我已经在网上搜索答案很长一段时间了 但这让我非常头疼 我使用的是 Ubuntu 12 04 我想从终端执行 Python 脚本而不使用完整路径 因此 我通过将以下内容添加到 bashrc 中 将 home kyril python scri
  • 嵌入式 Jetty 找不到带注释的 Servlet

    短的 我有一个提供 war 工件的项目 其中包含带有注释的 servlet 但没有 web xml 如果我尝试在 jetty 中使用 war 我总是只能得到 war 内容的目录列表 而不是 servlet 执行 任何想法 很长的故事 我的
  • SQL 按最近日期选择具有两个唯一列的行

    使用以下查询和结果 我正在查找 ChargeId 和 ChargeType 唯一的最新条目 select chargeId chargeType serviceMonth from invoice CHARGEID CHARGETYPE S
  • Hindley-Milner 的哪一部分是你不明白的?

    I swear曾经有一个T shirt出售带有不朽文字的 哪一部分 do you not理解 就我而言 答案是 全部 特别是 我经常在 Haskell 论文中看到这样的符号 但我不知道它的含义 我不知道它应该是数学的哪个分支 我当然认识希腊
  • 在Interceptor.intercept()内部,我如何知道Action是否已经被执行?

    我正在使用拦截器在基于 Struts 的应用程序中实现一些内容 但我对它们的生命周期如何工作感到困惑 根据 Struts 文档 拦截者 编写拦截器 and 大图景 它应该像这样工作 FirstInterceptor NextIntercep
  • Boost::解析字符串时的精神斗争

    我正在尝试用 Boost Spirit 解析字符串 但我无法让它工作 从今天起我就没有使用 Boost Spirit 的经验了 该字符串由用 分隔的命令组成 命令是 INC 一些整数 BOMB 第一个整数 第二个整数 MOVE 第一个整数
  • Typescript:重写超类方法而不需要知道超类方法签名

    以下是我如何可靠地重写 vanilla JS 中的方法 而不关心名称或参数数量或返回值 import EventEmitter from events console log event arguments every time this