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"])