首页 > 解决方案 > 实现流畅的泛型类方法 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())

的推断类型mappedArrArray_<string>,但我希望它是ArrayCustom<string>

标签: typescriptclassgenericsmethodsfluent

解决方案


您可以做的是重新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:我将您更改ArrayAppArray- 我收到了 Array 的重复类型编译错误,因为它已经作为全局类型存在。

您不能使用Polymorphic this typesmap ,因为您每次都为流利的接口返回一个新对象。那将要求对象相同。此外,无法对返回的数组类型进行参数化,因为 TypeScript 不支持更高种类的泛型类型(请参阅 jcalz 的评论)。

旁注:如果您想对数组进行浅层克隆,映射所有项目并且不依赖异步生成器,您可以通过以下方式map更轻松地实现Array.from

map2<Y>(projector: (item: T) => Y): AppArray<Y> {
  return new AppArray(Array.from(this, projector));
}

操场


推荐阅读