ค้นหาเว็บไซต์

อินเทอร์เฟซแฮชแมพ/พจนานุกรมของ TypeScript


ฉันกำลังพยายามที่จะนำอินเทอร์เฟซของแฮชแมป/ดิกชันนารีไปใช้งาน จนถึงตอนนี้ฉันมี:

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

ฉันกำลังมีปัญหาในการเข้าใจว่าซินแท็กซ์นี้หมายความว่าอย่างไร หากฉันจะทำ var x : IHash={}; ฉันจะเพิ่มหรือเข้าถึงข้อมูลได้อย่างไร?

คำตอบ #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"

สิ่งนี้ทำให้คุณสามารถมีวัตถุ อินสแตนซ์ ใดๆ (ไม่ใช่แค่ตัวเลข/สตริง) เป็นคีย์ได้

แม้ว่ามันจะค่อนข้างใหม่ ดังนั้นคุณอาจต้องใช้โพลีฟิลถ้าคุณกำหนดเป้าหมายไปที่ระบบเก่า

คำตอบ #2

วิธีที่ง่ายที่สุดและถูกต้องคือการใช้ประเภทเรคอร์ด Record<string, string>

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();
  }
}

บทความที่เกี่ยวข้อง