TypeScript对象作为C#中的字典types

我有一些使用对象作为词典的JavaScript代码; 例如一个“人物”对象将会保存一些个人信息,从电子邮件地址中删除。

var people = {<email> : <some personal data'>}; adding > "people[<email>] = <data>;" getting > "var data = people[<email>];" deleting > "delete people[<email>];" 

是否可以在手稿中描述这个? 或者我必须使用数组?

当然:

 var map: { [email: string]: Customer; } = { }; map['foo@gmail.com'] = new Customer(); // OK map[14] = new Customer(); // Not OK, 14 is not a string map['bar@hotmail.com'] = 'x'; // Not OK, 'x' is not a customer 

如果您不想每次input整个types的注释,也可以创build一个接口:

 interface StringToCustomerMap { [email: string]: Customer; } var map: StringToCustomerMap = { }; // Equivalent to first line of above 

您可以使用像这样的模板接口:

 interface Map<T> { [K: string]: T; } let dict: Map<number> = {}; dict["one"] = 1; 

除了使用类似 Map对象之外,现在已经有了一个实际的Map对象 ,在编译为ES6时可以在TypeScript中使用,或者在使用带有ES6 types定义的 polyfill时可用:

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

它支持与Object相同的function,还有一些稍微不同的语法:

 // 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"); 

与使用类似地图的对象相比,这仅有几个优点,例如:

  • 支持基于非string的键,例如数字或对象,它们都不被Object支持(不, Object不支持数字,它将它们转换为string)
  • 当不使用--noImplicitAny ,出现错误的空间--noImplicitAny ,因为Map总是具有types和types,而对象可能没有索引签名
  • 与在Object上创build属性不同 ,添加/删除项目(键值对)的function针对任务进行了优化

另外, Map对象为常见任务提供了一个更强大和更优雅的API,其中大部分API不能通过简单的Object而不需要将helper函数绑定在一起(尽pipe其中一些需要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()); 

Lodash有一个简单的字典实现,并有良好的TypeScript支持

安装Lodash:

 npm install lodash @types/lodash --save 

导入和使用:

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