javascript - 如何在 TypeScript 中扩展 IterableIterator
问题描述
我正在尝试Iterable
使用类似于 C# 的 where 方法进行扩展Enumerable.where()
。扩展Array
原型很容易,但是我正在努力寻找如何扩展Iterable
.
这是声明:
declare interface Iterable<T> {
where<T>(this: Iterable<T>, predicate: (item: T) => boolean): Generator<T>;
}
问题在于实施。扩展方法编译得很好,但是在运行时尝试在 an Array
(它是 an Iterable
)或 any上使用该方法时Iterable
,它会抛出where()
未定义的。Array
您只需将方法实现添加到,Array.prototype
但Iterable
没有原型:
function* where<T>(this: Iterable<T>, predicate: (item: T) => boolean): Generator<T> {
for (const item of this) {
if (predicate(item)) {
yield item;
}
}
}
Iterable.prototype = function* where(...)
不起作用,因为Iterable
没有原型。
这是所需的用法:
public myMethod(myIterable: Iterable<number> ) {
console.log(myIterable.where(i => i > 3));
}
我该如何延长Iterable
?我应该延长IterableIterator
吗?
有人设法做到了另一个线程(https://stackoverflow.com/questions/62008192/typescript-`extending`-iterableiterator-for-array-type-but-return-a-simple-type)但他没有展示他如何扩展 Iterable 并告诉我问另一个问题。
解决方案
您可以扩展,IteratorPrototype
在这种情况下,您的方法将使用内置的迭代器array.keys()
或星号函数,但不适用于数组之类的迭代器。
正如您所说的那样,没有办法扩展Iterable
,因为在运行时不存在这样的东西。一般来说,更常见的做法是设计自己的“monad”,而不是扩展内置原型:
result = Enumerable(someIterable)
.where(...)
.map(...)
.etc(...)
.toList()
推荐阅读
- python - 如何让网格布局中的两个小部件相互对齐?
- java - 找不到 spring-boot-2.3.0.BUILD-SNAPSHOT.jar 错误
- linux - 将大 tar 文件拆分为多个 tar 文件
- kubernetes - kubectl apply with stringData in secret does not remove fields
- jenkins - 如何在 SonarQube 中生成 HTML 或 PDF 报告?
- mysql - 在配置 innodb_buffer_pool_size 时,如果您有很多小型网站而不是单个网站,该值应该不同吗?
- javascript - 数字的角度正则表达式仅适用于偶数长度的数字
- python-3.x - Python sorted() function key = lambda, index out of range error
- node.js - 是否可以使用邮递员查看图像?
- html - 在我实际设置 height: 100% 之前,相对 div 的高度为 100%