Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Typescript中创建(甚至更多的泛型)函数_Javascript_Typescript_Generics - Fatal编程技术网

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

Javascript 在Typescript中创建(甚至更多的泛型)函数,javascript,typescript,generics,Javascript,Typescript,Generics,我正在用Typescript创建一个简单的哈希表,我有两个函数,一个返回所有键,另一个返回所有值,我得到了如下结果: public values() { let values = new Array<T>(); this._keyMap.forEach((element) => element.forEach((innerElement) => values.push(innerElement.value)) ); retu

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

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

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;
  }
公共值(){
返回getArrayInfo('value');
}
公钥(){
返回getArrayInfo('key');
}
公共getArrayInfo(键:字符串){
让值=新数组();
此._keyMap.forEach((元素)=>
element.forEach((innerElement)=>values.push(innerElement[key]))
);
返回值;
}

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

基于Tim B James的响应,我能够想出一个完全使用typescript的解决方案,我将它发布在这里,以防有人感兴趣:

  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);
  }
枚举类型搜索{
key='key',
value='value'
}
公共getArrayInfo(类型:typeOfSearch){
让值=新数组();
此._keyMap.forEach((元素)=>
element.forEach((innerElement)=>
values.push(内部元素[type.valueOf()])
)
);
返回值;
}
公共价值观(){
返回此.getArrayInfo(typeOfSearch.value);
}
公钥(){
返回这个.getArrayInfo(typeOfSearch.key);
}

为什么不干脆
类CustomMap扩展Map{/*…*/}
?很好,我喜欢它。一点点的配对编码在那里进行着:D蹦蹦跳跳的想法!爱死它了!
  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);
  }