【发布时间】:2017-07-01 20:36:40
【问题描述】:
我是使用 TypeScript 的新手,我正在尝试实现 hashmap/dictionary 接口。到目前为止我有
export interface IHash {
[details: string] : string;
}
我在理解这个语法的确切含义时遇到了一些麻烦。如果我要做var x : IHash = {};,我将如何添加/访问数据?
【问题讨论】:
标签: typescript
我是使用 TypeScript 的新手,我正在尝试实现 hashmap/dictionary 接口。到目前为止我有
export interface IHash {
[details: string] : string;
}
我在理解这个语法的确切含义时遇到了一些麻烦。如果我要做var x : IHash = {};,我将如何添加/访问数据?
【问题讨论】:
标签: typescript
就像一个普通的js对象:
let myhash: IHash = {};
myhash["somestring"] = "value"; //set
let value = myhash["somestring"]; //get
你对[indexer: string] : string做了两件事
您可以使用[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。
【讨论】:
any 混淆了,要么他们改变了这种行为。我赌前者。谢谢。 :)
最简单正确的方法是使用Record type 记录
const myVar : Record<string, string> = {
key1: 'val1',
key2: 'val2',
}
【讨论】:
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();
}
}
【讨论】: