2012-11-29 33 views
209

Tôi có một số mã JavaScript sử dụng các đối tượng làm từ điển; ví dụ: đối tượng 'người' sẽ giữ một số chi tiết cá nhân được khóa khỏi địa chỉ email.Đối tượng TypeScript dưới dạng các loại từ điển như trong C#

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

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

Có thể mô tả điều này trong Bản mẫu không? hoặc tôi phải sử dụng một Array?

+1

Bài đăng cũ nhưng lưu ý rằng có Bản đồ ES6 –

Trả lời

358

chắc:

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 

Bạn cũng có thể thực hiện một giao diện nếu bạn không muốn gõ rằng toàn bộ các chú thích kiểu ra mỗi khi:

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

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

Đó là cách hữu ích để đảm bảo rằng trình biên dịch hạn chế chỉ mục thành chuỗi.Hấp dẫn. Không giống như bạn có thể chỉ định loại chỉ mục là bất kỳ thứ gì ngoài chuỗi hoặc số nguyên, nhưng điều đó có ý nghĩa, vì nó chỉ ánh xạ tới các chỉ mục đối tượng JS gốc. –

+2

Bạn có thể biết điều này, nhưng cũng có một số gotchas tiềm năng với cách tiếp cận này, lớn nhất là không có cách an toàn và dễ dàng để lặp qua tất cả các thành viên. Mã này, ví dụ, cho thấy rằng 'bản đồ' chứa hai thành viên: \t ( Object.prototype) .something = function() {}; \t \t lớp Khách hàng {} \t \t var map: {[email: string]: Customer; } = {}; \t map ['[email protected] '] = Khách hàng mới(); \t \t for (var i trong bản đồ) { \t \t console.log (bản đồ [i]) \t} –

+4

làm thế nào để bạn loại bỏ từ nó? – TDaver

56

Bạn có thể sử dụng giao diện templated như thế này:

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

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

Lưu ý rằng điều này va chạm với kiểu bản đồ es6. Tốt hơn câu trả lời khác vì ràng buộc chỉ mục bị bỏ qua. –

+0

làm cách nào để kiểm tra xem khóa có tồn tại trong từ điển không? – samneric

+0

dict.hasOwnProperty ('key') –

34

Ngoài việc sử dụng bản đồ- như đối tượng, đã có một Map object thực tế trong một thời gian bây giờ, trong đó có sẵn trong nguyên cảo khi biên soạn để ES6, hoặc khi sử dụng một polyfill với ES6 type-definitions:

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

Nó hỗ trợ các chức năng tương tự như Object, và hơn nữa, với một cú pháp hơi khác nhau:

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

này mình có một số ưu điểm so với sử dụng một Vẽ bản đồ như đối tượng, chẳng hạn như:

  • Hỗ trợ các khóa không dựa trên chuỗi, ví dụ: số hoặc các đối tượng, không ai trong số đó được hỗ trợ bởi Object (không, Object không hỗ trợ số, nó chuyển đổi chúng thành chuỗi)
  • Ít chỗ cho sai sót khi không sử dụng --noImplicitAny, như một Map luôn có một phím loại và một giá trị loại, trong khi một đối tượng thể không có một chỉ số thực chữ ký
  • chức năng thêm/gỡ bỏ các mục (cặp khóa-giá trị) được tối ưu hóa cho công việc, unlike creating properties on an Object

một theo đó, một đối tượng Map cung cấp một API mạnh mẽ và thanh lịch hơn cho các tác vụ thông thường, hầu hết không có sẵn thông qua đơn giản Object s mà không cần hack các hàm trợ giúp khác nhau (mặc dù một số yêu cầu một polyfter lặp/lặp lại đầy đủ ES6 cho các mục tiêu ES5 hoặc bên dưới) :

// 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 có một từ điển thực hiện đơn giản và có hỗ trợ đánh máy tốt

Install Lodash:

npm install lodash @types/lodash --save 

nhập khẩu và sử dụng:

import { Dictionary } from "lodash"; 
let properties : Dictionary<string> = { 
    "key": "value"   
} 
console.log(properties["key"]) 
Các vấn đề liên quan