TypeScript hashmap/dictionary接口

mys*_*ick 58 typescript

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

export interface IHash {
    [details: string] : string;
} 
Run Code Online (Sandbox Code Playgroud)

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

Mei*_*hes 96

就像一个普通的js对象一样:

let myhash: IHash = {};   

myhash["somestring"] = "value"; //set

let value = myhash["somestring"]; //get
Run Code Online (Sandbox Code Playgroud)

你正在做两件事 [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"
Run Code Online (Sandbox Code Playgroud)

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

虽然它相对较新,但如果您定位旧系统,则可能需要对其进行填充.


aWe*_*per 29

最简单正确的方法是使用Record 类型 Record<string, string>

const myVar : Record<string, string> = {
   key1: 'val1',
   key2: 'val2',
}
Run Code Online (Sandbox Code Playgroud)


C S*_*ith 6

var x : IHash = {};
x['key1'] = 'value1';
x['key2'] = 'value2';

console.log(x['key1']);
// outputs value1

console.log(x['key2']);
// outputs value2
Run Code Online (Sandbox Code Playgroud)

如果您想迭代字典,可以使用.

Object.keys(x).forEach((key) => {console.log(x[key])});
Run Code Online (Sandbox Code Playgroud)

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

您还在问题中提到了一个hashmap,上面的定义是针对字典样式的接口.因此,键将是唯一的,但值不会.

您只需将相同的值分配给键及其值即可将其用作哈希集.

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

var valueToAdd = 'one';
if(!x[valueToAdd])
   x[valueToAdd] = valueToAdd;
Run Code Online (Sandbox Code Playgroud)

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

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();
  }
}
Run Code Online (Sandbox Code Playgroud)