2012-11-29 33 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"]) 
相关问题