2012-11-29 32 views
209

我有一些使用對象作爲字典的JavaScript代碼;例如,「人物」對象將會保留一些個人信息,這些信息是從電子郵件地址中刪除的。TypeScript對象作爲C#中的字典類型

var people = {<email> : <some personal data'>}; 

adding > "people[<email>] = <data>;" 
getting > "var data = people[<email>];" 
deleting > "delete people[<email>];" 

可以在Typescript中描述這個嗎?或者我必須使用數組?

+1

舊帖子,但請注意,有ES6映射 –

回答

358

肯定的:

interface StringToCustomerMap { 
    [email: string]: Customer; 
} 

var map: StringToCustomerMap = { }; 
// Equivalent to first line of above 
+1

這是確保編譯器將索引限制爲字符串的有用方法。有趣。看起來你不能指定索引類型爲字符串或整數以外的任何東西,但這很有意義,因爲它只映射到本機JS對象索引。 –

+2

您可能知道這一點,但這種方法也存在一些潛在的問題,最大的問題是沒有安全簡單的方法來遍歷所有成員。例如,此代碼顯示'map'包含兩個成員: \t( Object.prototype).something = function(){}; \t \t 類客戶{} \t \t 變種地圖:{[電子郵件地址:字符串]:客戶; } = {}; \t map ['[email protected]'] = new Customer(); \t \t爲(VAR我在地圖){ \t \t的console.log(圖[1]) \t} –

+4

你如何從中刪除? – TDaver

56

您可以使用這樣的模板接口:

var map: { [email: string]: Customer; } = { }; 
map['[email protected]'] = new Customer(); // OK 
map[14] = new Customer(); // Not OK, 14 is not a string 
map['[email protected]'] = 'x'; // Not OK, 'x' is not a customer 

您還可以,如果你不想每次鍵入整個類型標註出來做一個接口:

interface Map<T> { 
    [K: string]: T; 
} 

let dict: Map<number> = {}; 
dict["one"] = 1; 
+5

請注意,這與es6 Map類型相沖突。比其他答案更好,因爲索引約束被忽略。 –

+0

如何檢查字典中是否存在密鑰? – samneric

+0

dict.hasOwnProperty('key') –

34

除了使用MAP-對象,出現了有一段時間的實際Map object,編譯到ES6時,或使用與ES6 type-definitions一個填充工具時,這是在打字稿可用:

let people = new Map<string, Person>(); 

它支持相同的功能Object,和更多,具有稍微不同的語法:

// Adding an item (a key-value pair): 
people.set("John", { firstName: "John", lastName: "Doe" }); 

// Checking for the presence of a key: 
people.has("John"); // true 

// Retrieving a value by a key: 
people.get("John").lastName; // "Doe" 

// Deleting an item by a key: 
people.delete("John"); 

此單獨擁有使用MAP- 對象的幾個優點,如:

  • 支持基於非字符串的密鑰,例如這兩個國家都通過Object支持數字或對象,(不,Object不支持數字,將它們轉換爲字符串)不使用--noImplicitAny的時候,作爲一個Map總是有關鍵類型和錯誤
  • 的空間更小類型,而對象可能不具有索引簽名
  • 添加/移除項(鍵 - 值對)的任務被最優化的功能,unlike creating properties on an Object

甲通常情況下,Map對象爲常見任務提供了更強大和更優雅的API,但大多數API不通過簡單的Object s就可以使用,而無需一起輔助函數(儘管其中一些需要用於ES5目標或更低級別的完整ES6迭代器/可迭代polyfill) :

// Iterate over Map entries: 
people.forEach((person, key) => ...); 

// Clear the Map: 
people.clear(); 

// Get Map size: 
people.size; 

// Extract keys into array (in insertion order): 
let keys = Array.from(people.keys()); 

// Extract values into array (in insertion order): 
let values = Array.from(people.values()); 
2

Lodash有一個簡單的解釋執行,具有良好的打字稿支持

安裝Lodash:

npm install lodash @types/lodash --save 

進口和使用:

import { Dictionary } from "lodash"; 
let properties : Dictionary<string> = { 
    "key": "value"   
} 
console.log(properties["key"]) 
相關問題