【问题标题】:TypeScript hashmap/dictionary interfaceTypeScript hashmap/字典接口
【发布时间】:2017-07-01 20:36:40
【问题描述】:

我是使用 TypeScript 的新手,我正在尝试实现 hashmap/dictionary 接口。到目前为止我有

export interface IHash {
    [details: string] : string;
} 

我在理解这个语法的确切含义时遇到了一些麻烦。如果我要做var x : IHash = {};,我将如何添加/访问数据?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    就像一个普通的js对象:

    let myhash: IHash = {};   
    
    myhash["somestring"] = "value"; //set
    
    let value = myhash["somestring"]; //get
    

    你对[indexer: string] : string做了两件事

    • 告诉 TypeScript 对象可以有任何基于字符串的键
    • 对于所有键条目,值必须是字符串类型。

    您可以使用[key: string]: any; 制作具有显式类型字段的通用字典

    例如age 必须是 number,而 name 必须是字符串 - 两者都是必需的。任何隐式字段都可以是任何类型的值。

    作为替代,有一个Map 类:

    let map = new Map<object, string>(); 
    
    let key = new Object();
    
    map.set(key, "value");
    map.get(key); // return "value"
    

    这允许您将任何对象实例(不仅仅是数字/字符串)作为键。

    虽然它相对较新,但如果您针对旧系统,您可能需要对其进行 polyfill。

    【讨论】:

    • “除非另有明确说明” - 以及如何表述? AFAIK,任何明确声明的字段都必须符合索引签名。
    • 嗯……你说得对。要么我将其与将其键入为any 混淆了,要么他们改变了这种行为。我赌前者。谢谢。 :)
    【解决方案2】:

    最简单正确的方法是使用Record type 记录

    const myVar : Record<string, string> = {
       key1: 'val1',
       key2: 'val2',
    }
    

    【讨论】:

      【解决方案3】:
      var x : IHash = {};
      x['key1'] = 'value1';
      x['key2'] = 'value2';
      
      console.log(x['key1']);
      // outputs value1
      
      console.log(x['key2']);
      // outputs value2
      

      如果你想遍历你的字典,你可以使用。

      Object.keys(x).forEach((key) => {console.log(x[key])});
      

      Object.keys 返回对象的所有属性,因此它可以很好地返回字典样式对象的所有值。

      您在问题中还提到了哈希图,上面的定义是针对字典样式的界面。因此,键将是唯一的,但值不会。

      您可以像使用哈希集一样使用它,只需为键及其值分配相同的值。

      如果您希望键是唯一的并且具有可能不同的值,那么您只需在添加之前检查对象上是否存在该键。

      var valueToAdd = 'one';
      if(!x[valueToAdd])
         x[valueToAdd] = valueToAdd;
      

      或者您可以构建自己的类来充当各种哈希集。

      Class HashSet{
        private var keys: IHash = {};
        private var values: string[] = [];
      
        public Add(key: string){
          if(!keys[key]){
            values.push(key);
            keys[key] = key;
          }
        }
      
        public GetValues(){
          // slicing the array will return it by value so users cannot accidentally
          // start playing around with your array
          return values.slice();
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-05-01
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 2016-08-05
        • 2021-12-12
        相关资源
        最近更新 更多