อินเทอร์เฟซแฮชแมพ/พจนานุกรมของ 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();
}
}

