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:重写超类方法而不需要知道超类方法签名 的相关文章

  • 错误:尝试扩展 tslint-microsoft-contrib 时找不到模块“tslint/lib/lint”

    这就是我们的环境 gt node modules bin tslint version 4 0 1 gt npm install save dev tslint microsoft contrib email protected cdn c
  • Typescript 递归地更改属性类型

    如何递归地改变属性类型 我只能在单一维度上做到这一点 从实用程序类型 https github com piotrwitek utility types似乎有可能实现这一目标 我已经尝试过多次但无法做到正确 type Convert
  • TypeScript AngularJS 组件模态 - this.$modalInstance.dismiss 不是一个函数?

    我已将其中一个用户数据输入表单转换为 uib 模式 但是当我尝试从 取消 按钮关闭模式时 出现以下错误 this modalInstance dismiss is not a function 同样的事情是如果使用this modalIns
  • TypeScript:将模块拆分为多个文件

    我想将同一模块中的类定义拆分为多个文件 所以我确实喜欢这个并且它有效 a ts module MyModule class ClassA b ts module My Module class ClassB 然后我尝试在 ClassB 中使
  • angular2存储许多字符串值

    我有一些必须在许多组件中使用的字符串常量值 我不想在各个组件中硬编码或将它们写为字符串 在 Angular2 应用程序中维护它们的最佳位置在哪里 解决方案之一是将字符串放置在共享服务中 将服务注入到需要该属性的每个组件中 如果您的字符串不是
  • 打字稿日期格式

    我正在使用角度 2 4 我怎样才能将日期格式化为这个2017 10 03T14 51 06 078Z 下面是我的代码 public today number Date now console log today time this toda
  • 通过引用传递参数到指针问题

    每次我尝试编译代码时都会收到错误 cannot convert parameter 1 from int to int 测试代码如下所示 void set int val val 10 int main int myVal int pMyV
  • 使用 @nomiclabs/hardhat-waffle 实现装置

    在官方华夫饼文档中 您可能会找到实现装置的下一种方法 import expect from chai import loadFixture deployContract from ethereum waffle import BasicTo
  • Node.js 10 的 TypeScript tsconfig 设置?

    有谁知道 Node js v10 x 需要哪些目标 库才能在没有生成器的情况下使用内置的 async await 我看到很多关于节点 8 的信息 但没有看到关于节点 10 的信息 从 Node js 开始10 0 0 100 支持ES201
  • 如何为 Angular 4、5 中的动态元素分配哈希 ID ref id

    如果我的问题很愚蠢 我很抱歉 我有 30 多个静态 ng container 和一些独特的静态 hashtagID 但我想在 ngFor 的帮助下动态创建它们 public lists food book cook 期望输出
  • Angular 没有 NameService 提供者

    我在将类加载到 Angular 组件中时遇到问题 我已经尝试解决这个问题很长时间了 我什至尝试过将所有内容合并到一个文件中 我所拥有的是 应用程序 ts
  • Typescript 和 Mongoose - “this”在实例方法中不可用

    我目前正在将我的 API 从 JS 转换为 TS 然而 我在猫鼬和打字稿方面遇到了一些困难 具体来说 this在我的实例方法中不可用 My code AccountSchema methods comparePassword async f
  • 如何将 zingchart 实现到 Angular2 中

    我有一个现有的项目 我想在其上实施 zingcharts 我尝试了 3 个不同的教程 主要来自 https blog zingchart com 2016 07 19 zingchart and angular 2 charts back
  • iOS:调用 Objective-C 方法的处理开销是多少?

    我正在编写一些实时音频处理代码 该代码将在音频单元的渲染回调中执行 该线程处于系统识别的最高优先级 Apple 指示最大限度地减少此调用中进行的处理量 他们的建议之一是避免 Objective C 方法调用 But why 调用 Objec
  • 角度2中未定义的值

    我正在创建一个应用程序 在其中使用 Ag Grid api 在网页上列出我的数据库内容 Ag grid 有一个预定义的 api 来获取所选行的内容 这是我的代码 export class customer entryComponent pu
  • 在 Angular 6 服务中获取当前路由参数的最佳方法是什么?

    我试图找出在 Angular 6 中获取当前路由参数的最佳方法是什么 目前我必须通过ActivatedRoute到服务的方法作为参数 然后在服务中使用它 export class MainComponent constructor priv
  • 添加 PayPal 付款方式 Ionic

    我正在尝试在我的用 Ionic 2 3 制作的应用程序上实现 PayPal 付款方式 我已经安装了 ionic cordova plugin add com paypal cordova mobilesdk npm install save
  • 如何在 Angular @Input 中仅接受预定义值

    我的问题是 我在 a 中收到一个字符串值作为组件的参数 但我想限制可以用作参数的值 就像enum I use Input type string 但是在组件中 一切都可以引入type正如我之前所说 我需要将其限制为 3 个选项 例如Enum
  • D3、TS 和 Angular 2

    我正在尝试将 D3 v4 与 Angular 2 Typescript 一起使用 我目前正在研究 D3 v4 我能够遵循 stackoverflow 中类似问题的一些答案 但没有成功 我已经导入了大部分 D3 库及其类型 我使用的是 TS
  • 想要动态处理与分页相关的页码显示:ReactJS

    我有一些分页逻辑工作得很好 唯一的问题是我只能让它显示并固定数量的页面可供选择 现在我已经把它放到了 5 页 但我希望它能够根据总记录动态更改 假设我有 100 条记录 每页限制为 10 条 将有 10 页 现在我只能让它以这种方式显示 第

随机推荐

  • 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