簡體   English   中英

在Typescript中創建(甚至更多的泛型)函數

[英]Creating (even more generics) functions in Typescript

我在Typescript中創建一個簡單的哈希表,我有兩個函數,一個函數返回所有鍵,另一個函數返回所有值,並且我得到了如下信息:

  public values() {
    let values = new Array<T>();
    this._keyMap.forEach((element) =>
      element.forEach((innerElement) => values.push(innerElement.value))
    );
    return values;
  }

  public keys() {
    let values = new Array<string>();
    this._keyMap.forEach((element) =>
      element.forEach((innerElement) => values.push(innerElement.key))
    );
    return values;
  }

我想做的就是將這兩個函數壓縮為一個,因為重復的代碼很多,我只需要將類型傳遞給函數(對於數組),這很容易,但是對於一個我需要按下innerElement.value和其他innerElement.key所以希望我會像這樣:

  public values() {
    return getArrayInfo<T>(/*code to return value*/);
  }
  public keys() {
    return getArrayInfo<String>(/*code to return keys*/);
  }

 public getArrayInfo<I>(/*something*/) {
    let values = new Array<I>();
    this._keyMap.forEach((element) =>
      element.forEach((innerElement) => values.push(/*something*/))
    );
    return values;
  }

您所擁有的幾乎是什么。 您可以使用屬性索引簽名。

public values() {
    return getArrayInfo<T>('value');
  }
  public keys() {
    return getArrayInfo<String>('key');
  }

 public getArrayInfo<I>(key: string) {
    let values = new Array<I>();
    this._keyMap.forEach((element) =>
      element.forEach((innerElement) => values.push(innerElement[key]))
    );
    return values;
  }

但是,這樣做會損失很多類型安全性,並且您可能想在混合中添加一些未定義/空檢查。

根據Tim B James的回答,我提出了一個完全使用打字稿的解決方案,如果有興趣,我將其張貼在這里:

  enum typeOfSearch {
    key = 'key',
    value = 'value'
  }

  public getArrayInfo<I>(type: typeOfSearch) {
    let values = new Array<I>();
    this._keyMap.forEach((element) =>
      element.forEach((innerElement) =>
        values.push(innerElement[type.valueOf()])
      )
    );
    return values;
  }

  public values() {
    return this.getArrayInfo<T>(typeOfSearch.value);
  }

  public keys() {
    return this.getArrayInfo<String>(typeOfSearch.key);
  }

暫無
暫無

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

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