【发布时间】:2019-12-17 02:51:09
【问题描述】:
如何在集合类上实现流畅的(可链接的)通用映射函数?考虑以下内容:
class Array_<T> {
private _arr: T[]
constructor(iterable: Iterable<T>) { this._arr = [...iterable] }
[Symbol.iterator]() { return this._arr[Symbol.iterator]() }
map<Y>(projector: (item: T) => Y): Array_<Y> {
return new Array_((function* (iterable: Iterable<T>) {
for (const element of iterable) {
yield projector(element)
}
})(this))
}
}
class ArrayCustom<T> extends Array<T> { }
let mappedArr = new ArrayCustom([1,2,3]).map(element=>element.toString())
mappedArr 的推断类型是Array_<string>,但我希望它是ArrayCustom<string>
【问题讨论】:
-
使用名称
Array是不幸的,因为通常在范围内已经有一个名称为Array的数组构造函数。而在 TypeScript 中,Array<T>类型已经与T[]相同。这充其量是令人困惑的(如果您在自己的模块或命名空间中隐藏名称),最坏的情况是错误(如果您尝试在全局范围内执行此操作)。考虑改变它。 -
@jcalz 这仅用于说明目的;我的代码中没有使用名称
Array -
除非您试图说明阴影或名称冲突,否则我建议您在问题代码中更改它...请注意下面的答案必须如何将其更改为其他内容 (
AppArray)为了正确编译答案。
标签: typescript class generics methods fluent