如何使用 Typescript 实现带有自定义方法的类似数组的类?

2024-01-14

我想实现一个类似数组的类:

  1. 接受数组作为构造函数的参数
  2. 应该是可迭代的并且具有所有内置数组的方法
  3. 有一些自定义方法
  4. 应该能够扩展其他类

我是这样看的:

class BaseModel {
  arr: Array;

  constructor(arr: Array<any>) { // <= req. #1
    this.arr = arr;
  }

  serialize(arr) { // <= req. #3
    this.arr = arr;
  }
}

class ListModel extends BaseModel { // <= req. #4
  constructor(arr: Array<any>) { // <= req. #1
    super(arr);
  }

  sayHello() { // <= req. #3
    console.log('hello');
  }
}

let list = new ListModel([1,2,3]);
list.sayHello();
// expected output:
// 'hello'
list.push(4); // <= req. #2

for (let a of list) { // <= req. #2
  console.log(a);
}
// expected output:
// 1
// 2
// 3
// 4
list.serialize([2,3]);

for (let a of list) {
  console.log(a);
}
// expected output:
// 2
// 3

用打字稿可以吗?我寻找解决方案,但没有找到更接近这些要求的解决方案。谢谢!


您可以延长Array类并通过这样做建立要求#2。
我认为这是一个符合您所有要求的实现:

class MyArray<T> extends Array<T> {
    constructor(items?: T[]) {
        super();
        items && this.addItems(items);
    }

    public serialize(items: T[]): void {
        this.splice(0, this.length);
        this.addItems(items);
    }

    private addItems(items: T[]) {
        items.forEach(item => this.push(item));
    }
}

class StringsList extends MyArray<string> {
    public sayHello(): void { // req. #3
        console.log("hello");
    }
}

class NumbersList extends MyArray<number> {
    public sum(): number { // req. #3
        return this.reduce((prev: number, current: number) => prev + current);
    }
}

如果您不喜欢泛型部分,您可以简单地扩展Array<any>.

Examples https://www.typescriptlang.org/play/#src=class%20MyArray%3CT%3E%20extends%20Array%3CT%3E%20%7B%0A%09constructor(items%3F%3A%20T%5B%5D)%20%7B%0A%09%09super()%3B%0A%09%09items%20%26%26%20this.addItems(items)%3B%0A%09%7D%0A%0A%09public%20serialize(items%3A%20T%5B%5D)%3A%20void%20%7B%0A%09%09this.splice(0%2C%20this.length)%3B%0A%09%09this.addItems(items)%3B%0A%09%7D%0A%0A%09private%20addItems(items%3A%20T%5B%5D)%20%7B%0A%09%09items.forEach(item%20%3D%3E%20this.push(item))%3B%0A%09%7D%0A%7D%0A%0Aclass%20StringsList%20extends%20MyArray%3Cstring%3E%20%7B%0A%09public%20sayHello()%3A%20void%20%7B%0A%09%09console.log(%22hello%22)%3B%0A%09%7D%0A%7D%0A%0Aclass%20NumbersList%20extends%20MyArray%3Cnumber%3E%20%7B%0A%09public%20sum()%3A%20number%20%7B%0A%09%09return%20this.reduce((prev%3A%20number%2C%20current%3A%20number)%20%3D%3E%20prev%20%2B%20current)%3B%0A%09%7D%0A%7D%0A%0Alet%20arr1%20%3D%20new%20MyArray(%5B%22hey%22%2C%204%2C%20true%5D)%3B%0Aconsole.log(arr1)%3B%20%2F%2F%20%5B%22hey%22%2C%204%2C%20true%5D%0A%0Aarr1.push(99)%3B%0Aconsole.log(arr1)%3B%20%2F%2F%20%5B%22hey%22%2C%204%2C%20true%2C%2099%5D%0A%0Aarr1.forEach(item%20%3D%3E%20console.log(item))%3B%20%2F%2F%20hey%2C%204%2C%20true%2C%2099%0A%0Alet%20arr2%20%3D%20new%20StringsList(%5B%22str1%22%2C%20%22str2%22%5D)%3B%0Aconsole.log(arr2)%3B%20%2F%2F%20%5B%22str1%22%2C%20%22str2%22%5D%0A%0Aarr2.serialize(%5B%22str3%22%2C%20%22str4%22%5D)%3B%0Aconsole.log(arr2)%3B%20%2F%2F%20%5B%22str3%22%2C%20%22str4%22%5D%0A%0Alet%20arr3%20%3D%20new%20NumbersList(%5B1%2C2%2C3%2C4%2C5%5D)%3B%0Aconsole.log(arr3.sum())%3B%20%2F%2F%2015:

let arr1 = new MyArray(["hey", 4, true]);
console.log(arr1); // ["hey", 4, true]

arr1.push(99);
console.log(arr1); // ["hey", 4, true, 99]

arr1.forEach(item => console.log(item)); // hey, 4, true, 99

let arr2 = new StringsList(["str1", "str2"]);
console.log(arr2); // ["str1", "str2"]

arr2.serialize(["str3", "str4"]);
console.log(arr2); // ["str3", "str4"]

let arr3 = new NumbersList([1,2,3,4,5]);
console.log(arr3.sum()); // 15
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Typescript 实现带有自定义方法的类似数组的类? 的相关文章

随机推荐

  • Django 的 CreateView 不保存对象

    我正在练习 Django 的通用视图 特别是ModelForms 这些是我的观点和模型 模型 py class Post models Model user models ForeignKey User post title models
  • 为什么我使用kill -0 (|pid) 得到不同的结果

    我正在编写一个脚本 该脚本将启动另一个进程 并在一段时间后杀死它 如果它没有自行退出 自从开始这件事以来 我开始意识到timeout命令是执行此操作的正确方法 但我仍然对为什么我的方法之一失败感到困惑 这就是我正在尝试的 bin bash
  • JS 在循环内等待回调完成

    我的 Node js 应用程序中有一个 for 循环 在此循环内 每次迭代都可以执行 mysql 查询 并非总是如此 具体取决于情况 查询是异步的 我在成功回调中得到结果 但我需要 for 循环的每次迭代都等待回调完成 如果需要 funct
  • Mongodb TTL 使文档提前过期

    我正在尝试将文档插入 Mongo 数据库并让它在预定时间后自动过期 到目前为止 我的文档已被插入 但总是会在 0 60 秒内从数据库中删除 即使我将 expireAfterSeconds 设置得更长 我知道 mongodb 大约每 60 秒
  • 具有重叠时隙的会议调度算法

    我想做类似的事情预约调度算法 N个人 N个忙闲时段 约束满足 https stackoverflow com questions 11143439 appointment scheduling algorithm n people with
  • 在Python中将秒转换为周-天-小时-分钟-秒

    我正在尝试编写一个 输入秒数 的 Python 脚本 并在周 天 小时 分钟和秒内获得结果 这是我所拥有的 但我没有得到正确的答案 我究竟做错了什么 seconds raw input Enter the number of seconds
  • Firebase 上 iOS 的 Flutter 集成测试?

    是否可以在 Firebase 上运行 Flutter 集成测试 这方面的信息似乎相互矛盾 一些消息来源说这是可能的 但文档 https pub dev packages integration test firebase test lab
  • 将 wpf 图像控件保存到文件的最简单方法

    我的 wpf 应用程序中有一个 Image 控件 里面有一个大图像 但控件本身只有 60x150 这意味着它只显示该图像的特定部分 将可见部分保存到文件的最简单方法是什么 感谢您的帮助 编辑 我最终使用了找到的代码here http nui
  • Fabric - 在所有任务完成之前和之后在本地运行命令

    我试图在我的结构脚本中宣布部署开始和结束 感觉这应该很容易 但对于我来说 我不知道该怎么做 env hosts www1 www2 www3 www4 def announce start code to connect to irc se
  • 关于从 VBScript 返回值到 .NET 的问题

    我正在尝试设置一个能够从 NET 运行 VBScript 文件的应用程序 请参阅here https stackoverflow com questions 2886155 how do i get back results running
  • 如何在discord.py 中设置可选参数?

    我尝试过在线研究 但没有其他问题能够帮助我解决问题 这是我的场景 我正在discord py 中创建静音命令 我希望时间是可选的 但如果未指定时间 我希望该参数成为原因的一部分 澄清我的意思 client command commands
  • 如何将应用程序日志动态输出到TextArea和文本文件?

    我有一个 javaFX 应用程序 但遇到日志记录问题 我不知道如何将日志动态输出到 JavaFX 中的 TextArea 并同时输出到文件 对于文件我有这样的设置 handlers java util logging FileHandler
  • jQuery 语法 - 何时使用 $(美元)与 jQuery [重复]

    这个问题在这里已经有答案了 这两者有什么区别 SPANID html Some Text jQuery SPANID html Some Text 它是原型还是 jQuery 他们都做同样的事情 大多数库使用 作为访问库内函数的更短方式 j
  • 设置标签属性并使用 nokogiri builder (ruby) 将纯文本内容添加到标签

    我正在尝试使用 Nokogiri 和一些标签构建 XML 这些标签内既有属性又有纯文本 所以我试图做到这一点
  • 关于 Gatsby 页面加载网络请求的澄清

    我正在学习 Gatsby 的工作原理 并且有一个有 2 个页面的网站 两个页面都有彼此的超链接 由于 gatsby 使用 javascript 捆绑包将网站编译为静态页面 因此我希望 html 链接单击事件触发对服务器的页面请求以加载sec
  • 为什么当发送者不是名义发送者时,WeakEventManager 不会触发事件?

    我不喜欢非标准模式 但我正在对我的应用程序进行快速测试 并且遇到了这种奇怪的行为 考虑一个公开事件的普通类 这里是非常常见的 PropertyChanged 但我认为可能是任何其他事件 订阅者选择通过 WeakEventManager 帮助
  • Android 中图像的填充图案

    下面给出了两个图像 我将第一个图像称为帧图像 将第二个图像称为帧图像 这里 fst 是我的线性布局 我将帧图像设置为它的背景图像 现在我想在帧图像的白色区域中填充图案图像 帧图像的外部区域是透明的 内部区域是白色的 我如何在我的框架图像中填
  • 关于渲染脚本

    最近在搜renderscript的文章 好像没有 谁能给我一些关于 renderscript 的文章吗 Renderscript 的资源 文档和教程仍然非常稀缺 这是我找到的地方 Renderscript 简介 第 1 部分和第 2 部分
  • 找不到模块:错误:无法解析“/home/user/Desktop/my_app/src”中的“./app”

    我开始创建我的应用程序 因此我使用 webpack 实现了项目配置 项目结构是 node modules public bundle js index html src app jsx index jsx components appBar
  • 如何使用 Typescript 实现带有自定义方法的类似数组的类?

    我想实现一个类似数组的类 接受数组作为构造函数的参数 应该是可迭代的并且具有所有内置数组的方法 有一些自定义方法 应该能够扩展其他类 我是这样看的 class BaseModel arr Array constructor arr Arra