typescript - 实现流畅的泛型类方法 Typescript
问题描述
如何在集合类上实现流畅的(可链接的)通用映射函数?考虑以下内容:
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>
解决方案
您可以做的是重新map
定义ArrayCustom
:
class ArrayCustom<T> extends AppArray<T> {
map<Y>(projector: (item: T) => Y): ArrayCustom<Y> {
return super.map(projector)
}
}
// let mappedArr: ArrayCustom<string>
let mappedArr = new ArrayCustom([1, 2, 3]).map(element => element.toString());
PS:我将您更改Array
为AppArray
- 我收到了 Array 的重复类型编译错误,因为它已经作为全局类型存在。
您不能使用Polymorphic this typesmap
,因为您每次都为流利的接口返回一个新对象。那将要求对象相同。此外,无法对返回的数组类型进行参数化,因为 TypeScript 不支持更高种类的泛型类型(请参阅 jcalz 的评论)。
旁注:如果您想对数组进行浅层克隆,映射所有项目并且不依赖异步生成器,您可以通过以下方式map
更轻松地实现Array.from
:
map2<Y>(projector: (item: T) => Y): AppArray<Y> {
return new AppArray(Array.from(this, projector));
}
推荐阅读
- codenameone - CodenameOne:PropertyIndex.toJSON() 没有为对象列表生成正确的 JSON
- wso2 - 无法获取 scim 2.0 wso2 是用于获取辅助用户存储下的角色的 api
- python - 为什么我不能在将整数值写入 csv 文件之前附加它?
- c++ - Uninitialized member not caught by compiler. Is it a bug?
- javascript - SAPUI5 在 FileUploader 中选择文件在 OPA5 测试中不起作用
- c# - 表达式 lambda 转换为表达式树 - 错误 CS8072
- scala - 避免在 Wiremock 中记录特定请求
- swift - 有没有办法知道该方法是 Swift 中的协议实现?
- python - 如何验证我正在导入的文件中是否存在列表元素
- javascript - 就像我们在 babelTypes 中一样,将 JavaScript 代码转换为 AST 表示