15

我在 Typescript 编译器的代码中看到了“HashTable”的实现(在文件 src/compiler/core/hashTable.ts 中)。

你知道有没有办法可以直接在我的 Typescript 项目中使用它?

4

4 回答 4

28

您可以通过定义一个接口来实现一个非常简单的哈希表,其中键是一个字符串

class Person {
    name: string;
}

interface HashTable<T> {
    [key: string]: T;
}

var persons: HashTable<Person> = {};
persons["bob"] = new Person();
var bob = persons["bob"];

不过,它只能键入字符串或数字。

于 2013-09-24T14:28:46.900 回答
4

我对那些试图重新发明轮子的人感到厌烦。

Typescript 是 Javascript 的超集,这意味着任何 Javascript 都可以正常工作。

在 Javascript 中,你有 Map(),它不是 100% 像一个哈希表,但有类似的用法。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_collections

需要注意的一件事是,此处 Map 的实现允许您多次设置相同的键,它会覆盖旧值。

我为避免这种情况而制作并使用的一项功能如下:

private add<K,V>(map:Map<K,V>, key:K, value:V){
    if(map.has(key)){
        throw new TypeError("Key "+ key +" already exists!");
    }else{
        map.set(key,value);
    }
}

我通过执行以下操作将我之前定义的地图传递给它:

MyMap = new Map();

或者

MyMapStrict = new Map<string,string>();

而不是传递一个必须尊重映射键和值类型的键和值。否则 Typescript 编译器会抛出错误。

例子:

add(MyMapStrict, "myKey", "myvalue");

希望能帮助到你。

于 2018-03-28T10:49:19.153 回答
1

下载文件“hashTable.ts”并将其放在您的文件旁边。然后在文件的顶部执行:

///<reference path='hashTable.ts' />

PS:我建议看一下 TypeScript Generic Collections我编写的库。这是一个字典示例:

class Person {
    constructor(public name: string, public yearOfBirth: number,public city?:string) {
    }
    toString() {
        return this.name + "-" + this.yearOfBirth; // City is not a part of the key. 
    }
}

class Car {
    constructor(public company: string, public type: string, public year: number) {
    }
    toString() {
        // Short hand. Adds each own property 
        return collections.toString(this);
    }
}
var dict = new collections.Dictionary<Person, Car>();
dict.setValue(new Person("john", 1970,"melbourne"), new Car("honda", "city", 2002));
dict.setValue(new Person("gavin", 1984), new Car("ferrari", "F50", 2006));
console.log("Orig");
console.log(dict);

// Changes the same john, since city is not part of key 
dict.setValue(new Person("john", 1970, "sydney"), new Car("honda", "accord", 2006)); 
// Add a new john
dict.setValue(new Person("john", 1971), new Car("nissan", "micra", 2010)); 
console.log("Updated");
console.log(dict);

// Showing getting / setting a single car: 
console.log("Single Item");
var person = new Person("john", 1970); 
console.log("-Person:");
console.log(person);

var car = dict.getValue(person);
console.log("-Car:");
console.log(car.toString());
于 2013-09-12T08:02:53.310 回答
1

根据这篇博客文章,TypeScript 定义了一个Map看起来类似于HashTable

其他收藏

  • 弱地图
  • 弱集
于 2017-02-06T12:12:16.240 回答