Giao diện hashmap / từ điển TypeScript


100

Tôi mới sử dụng TypeScript và tôi đang cố triển khai giao diện hashmap / từ điển. Cho đến nay tôi có

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

Tôi đang gặp một số khó khăn khi hiểu chính xác cú pháp này có nghĩa là gì. Nếu tôi phải làm var x : IHash = {};như thế nào tôi sẽ thêm / truy cập dữ liệu?

Câu trả lời:


140

Cũng giống như một đối tượng js bình thường:

let myhash: IHash = {};   

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

let value = myhash["somestring"]; //get

Có hai việc bạn đang làm [indexer: string] : string

  • nói với TypeScript rằng đối tượng có thể có bất kỳ khóa dựa trên chuỗi nào
  • rằng đối với tất cả các mục nhập chính, giá trị PHẢI là kiểu chuỗi.

nhập mô tả hình ảnh ở đây

Bạn có thể tạo một từ điển chung với các trường được nhập rõ ràng bằng cách sử dụng [key: string]: any;

nhập mô tả hình ảnh ở đây

ví dụ agephải là number, while namephải là một chuỗi - cả hai đều bắt buộc. Mọi trường ngầm định có thể là bất kỳ kiểu giá trị nào.

Thay vào đó, có một Maplớp:

let map = new Map<object, string>(); 

let key = new Object();

map.set(key, "value");
map.get(key); // return "value"

Điều này cho phép bạn có bất kỳ cá thể Đối tượng nào (không chỉ số / chuỗi) làm khóa.

Mặc dù nó tương đối mới, vì vậy bạn có thể phải polyfill nó nếu bạn nhắm mục tiêu các hệ thống cũ.


1
"trừ khi được nhập rõ ràng bằng cách khác" - và nó có thể được nêu như thế nào? AFAIK, bất kỳ trường nào được nêu rõ ràng phải tuân theo chữ ký chỉ mục.
— Cerberus

huh ... bạn hoàn toàn đúng. hoặc tôi nhầm lẫn nó với việc nhập nó là anyhoặc họ đã thay đổi hành vi đó. Tôi đã đánh cuộc trước. Cảm ơn. :)
— Meirion Hughes

11

Cách đơn giản và đúng đắn nhất là sử dụng kiểu Record Record <string, string>

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

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

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

console.log(x['key2']);
// outputs value2

Nếu bạn muốn lặp lại từ điển của mình, bạn có thể sử dụng.

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

Object.keys trả về tất cả các thuộc tính của một đối tượng, vì vậy nó hoạt động tốt khi trả về tất cả các giá trị từ các đối tượng được tạo kiểu từ điển.

Bạn cũng đã đề cập đến một bản đồ băm trong câu hỏi của mình, định nghĩa trên là dành cho giao diện kiểu từ điển. Do đó, các khóa sẽ là duy nhất, nhưng các giá trị sẽ không.

Bạn có thể sử dụng nó như một bộ băm bằng cách chỉ định cùng một giá trị cho khóa và giá trị của nó.

nếu bạn muốn các khóa là duy nhất và có các giá trị khác nhau, thì bạn chỉ cần kiểm tra xem khóa có tồn tại trên đối tượng hay không trước khi thêm vào nó.

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

hoặc bạn có thể xây dựng lớp của riêng mình để hoạt động như một tập hợp các loại băm.

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();
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.