簡體   English   中英

實現流利的泛型類方法Typescript

[英]Implementing fluent generic class methods 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>

您可以做的是在ArrayCustom重新定義map

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這種類型 ,因為每次都在map為流利的接口返回一個新對象。 那將要求對象是相同的。 同樣,也無法對返回的數組類型進行參數化,因為TypeScript不支持更高種類的泛型類型 (請參閱jcalz的注釋)。

旁注:如果您想對數組進行淺表克隆,映射所有項目並且不依賴異步生成器,則可以使用Array.from實現map更容易:

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

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM