在Typescript中创建(甚至更多的泛型)函数

时间:2018-08-27 14:55:14

标签: javascript typescript generics

我正在用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;
  }

2 个答案:

答案 0 :(得分:1)

您拥有的东西非常接近。您可以使用属性索引签名。

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;
  }

但是,这样做会损失很多类型安全性,并且您可能想在混合中添加一些未定义/空检查。

答案 1 :(得分:1)

基于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);
  }