在 TypeScript 中返回新的自身等效项以进行类继承

2023-12-10

我有一个基类Collection它提供了基本的数组功能。此类针对其他特定于领域的用例进行了扩展。当像这样的“破坏”方法filter被调用时,它应该返回一个带有过滤元素的新实例(继续使用类方法而不是仅仅取回数组)。

在 PHP 中你会使用return new self()返回实际的子类或父类,基于它的构建基础(我认为对于 Java 来说它是return obj.newInstance())。但对于 JS/TS,我真的很难找到解决方案。我当前的解决方法是覆盖newInstance所有子类的方法。

有针对这个的解决方法吗?

class Collection<E> {
  protected items: E[];

  constructor(items: any[] = []) {
    this.items = items;
  }

  // doesn't work, just one of many attempts
  protected newInstance(items: E[]) {
    return new Collection(items);

    //return new this.constructor(items); // "This expression is not constructable"

    // return new this.constructor.prototype(items); // another attempt, says "this.constructor.prototype is not a constructor"
  }

  size() {
    return this.items.length;
  }

  // should filter and return new instance to use class methods
  filter(callback: (item: any, index?: number) => boolean): this {
    // should be the actual instance (can be inherited)
    return this.newInstance(this.items.filter(callback)) as this;
  }
}

class NumberCollection extends Collection<number> {
  sum() {
    return this.items.reduce((a, b) => a + b, 0);
  }
}

let numbers = new NumberCollection([1, 2, 3, 4]);

console.log(numbers.sum()); // works,

// throws "sum() is not a function"
console.log(numbers.filter((n) => n > 1).sum());


要实现类型安全,请使用:

const { constructor } = Object.getPrototypeOf(this);
new constructor(...args);

See 参考同级.

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

在 TypeScript 中返回新的自身等效项以进行类继承 的相关文章

随机推荐

  • HTML5 Canvas 运动模糊效果?

    我正在尝试使用 HTML5 画布来制作类似运动模糊效果的东西 但没有成功 基本上我想做的是拍照并使其看起来像 快进 就像当你拍照并且人移动时一样 有几个画布库已经实现了各种模糊算法 EaselJS已独立实现 x 轴和 y 轴模糊 如您所见在
  • 如何在 Visual Studio 中关闭括号/引号自动完成

    正如标题中所述 如何关闭 MSVS 中的括号 引号 大括号自动完成功能 我主要对 C 和 XAML 感兴趣 但其他文本编辑器也很好 EDIT 目前我正在使用带有以下扩展的 MSVS 11 AnkhSVN 并发可视化工具 先发制人的分析聚合器
  • 使用instanceof运算符进行向下转型

    向下转型是指子类引用父类的对象 我尝试在不使用instanceof运算符的情况下执行此操作 class Food class bread4 extends Food static void method Food a bread4 b br
  • 如何将单一形式的两个部分以角度组合在一起?

    我正在使用角度动态表单制作角度应用程序 其中我通过 JSON 加载动态表单的数据 JSON 有两部分 例如第 1 部分和第 2 部分 jsonDataPart1 any elementType textbox class col 12 co
  • 对于 MySQLi,用什么替换 mysql_result [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 替换什么mysql result with 我现在正在看一个教程 但它是 2011 年制
  • 将效果应用于 jquery-ui 选项卡

    是否可以将效果应用于 jquery ui 选项卡 我还没有看到任何示例 并且我相当确定如果可能的话 以下内容是不正确的 如果您希望更改标签时发生效果 您可以执行类似的操作使用fx option function tabs tabs fx h
  • 如何使用 Intent 进行 Amazon App Store 搜索并按开发者名称进行过滤?

    有没有办法在 Kindle Fire 上启动 Intent 使 AppStore 应用程序打开并显示某个开发人员的所有应用程序 例如 在安装了 Android Market 的手机 平板电脑上 我可以执行以下操作 Intent otherA
  • selenium.common.exceptions.WebDriverException:消息:Linux 上的 ChromeDriver Selenium Python 服务 /usr/bin/google-chrome 意外退出

    from selenium import webdriver driver webdriver Chrome executable path r usr local bin google chrome driver get https ww
  • 我可以通过内容脚本对服务器上托管的 REST API 进行 ajax 调用吗?

    在构建 chrome 扩展时阅读博客和一些 stackoverflow 答案后 出于某种原因 我认为我们无法对托管在托管页面之外的另一个域下的服务器上托管的 REST API 进行 ajax 调用 它是否正确 在开发扩展程序时 我在单击扩展
  • 如何加载文件夹中的所有模块?

    有人可以为我提供一种导入整个模块目录的好方法吗 我有这样的结构 Foo bar py spam py eggs py 我尝试通过添加将其转换为包 init py和做from Foo import 但它并没有像我希望的那样工作 列出所有 py
  • 如何在.NET 中对多个 SqlConnection 使用单个 SqlTransaction?

    我有 SQL Server 2000 它不支持 MultipleActiveResults 我必须进行多次插入 并且每次插入只需一个连接即可完成 我想在所有插入之前开始事务并在所有插入之后完成事务 我该怎么做 您没有指定是否使用 NET 2
  • Pandas 过滤具有特定年份的数据帧行

    我有一个数据框df它有一个Date柱子 我想创建两个新的数据框 其中包含来自的所有行df其中年份等于some year和另一个包含所有行的数据框df如果年份不等于some year 我知道你能做到df ix 2000 1 1 2001 1
  • 聚合_id中相同字段错误

    我在 mongodb 中有一个像这样格式的集合 id ObjectId 542d5256372943d9e000fc42 class com bedas ays mongo dto AboneAriza AdSoyad AKIN COBAN
  • 如何在 macOS 中以编程方式安装 mac 中的自定义字体

    我有一个 Mac 应用程序 其中有自定义字体 但我的 Mac 应用程序文件夹的自定义字体书中不存在该字体 因此 当应用程序启动时 我使用以下代码检查 Mac 中是否安装了字体 NSArray fonts NSFontManager shar
  • 如何使 Acumatica 多行 PXGridColumn 显示新行?

    我正在自定义项目报价表单 屏幕 PM304500 上的描述字段 我需要描述字段是多行的 并且它必须保留新行 我已经自定义了字段本身以允许非常长的字符串 并且我已经使用 Multiline true 自定义了相应的 PXGridColumn
  • 解决防伪令牌问题

    我有一个表单帖子始终给我一个防伪令牌错误 这是我的表格 using Html BeginForm Html AntiForgeryToken Html EditorFor m gt m Email Html EditorFor m gt m
  • Python SQLite3 获取原始数据?

    我对这段代码有疑问 cur execute SELECT Balance FROM accounts print cur fetchone 输出 0 而不是我想要的0 任何人都可以帮助修复错误吗 很感谢任何形式的帮助 fetchone 将返
  • 取消跟踪文件并 gitignore 它,但拉取时不要在服务器上删除它

    我创建了一个项目并跟踪配置文件 现在我想将它们从跟踪和存储库中删除 所以我把它们放在 gitignore 中 然后我做了git rm cached与这些文件 我提交了它 但现在如果我拉出这个分支会发生什么 它会在远程删除服务器上的所有这些文
  • 在 Xamarin 中使用 ZeroMQ

    我有一个由服务器和客户端组成的应用程序 服务器是 C C 应用程序 客户端是面向 Windows Android 和 iOS 的跨平台 Xamarin 应用程序 服务器部分和客户端部分使用 ZeroMQ 消息进行通信 我尝试了当前的 C 实
  • 在 TypeScript 中返回新的自身等效项以进行类继承

    我有一个基类Collection它提供了基本的数组功能 此类针对其他特定于领域的用例进行了扩展 当像这样的 破坏 方法filter被调用时 它应该返回一个带有过滤元素的新实例 继续使用类方法而不是仅仅取回数组 在 PHP 中你会使用retu