Tôi đang tạo một lớp trong bản thảo có thuộc tính là Bản đồ ES6 (ECMAscript 2016) như sau:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
Làm cách nào để khai báo loại Bản đồ ES6 trong bản thảo?
Tôi đang tạo một lớp trong bản thảo có thuộc tính là Bản đồ ES6 (ECMAscript 2016) như sau:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
Làm cách nào để khai báo loại Bản đồ ES6 trong bản thảo?
Câu trả lời:
EDIT (ngày 5 tháng 6 năm 2019): Mặc dù ý tưởng rằng "TypeScript hỗ trợ Map
nguyên bản" vẫn đúng, vì phiên bản 2.1 TypeScript hỗ trợ một cái gì đó được gọi Record
.
type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
"a": { name: "joe" },
"b": { name: "bart" },
};
Thật không may, tham số chung đầu tiên (loại khóa) vẫn chưa được tuân thủ đầy đủ: ngay cả với một string
loại, một cái gì đó như peopleA[0]
(a number
) vẫn hợp lệ.
EDIT (ngày 25 tháng 4 năm 2016): Câu trả lời dưới đây đã cũ và không nên được coi là câu trả lời tốt nhất. TypeScript hiện hỗ trợ Bản đồ "nguyên bản", do đó, nó chỉ đơn giản cho phép Bản đồ ES6 được sử dụng khi đầu ra là ES6. Đối với ES5, nó không cung cấp polyfill; bạn cần phải tự nhúng chúng.
Để biết thêm thông tin, hãy tham khảo câu trả lời của mohamed hegazy dưới đây để có câu trả lời hiện đại hơn, hoặc thậm chí bình luận reddit này cho một phiên bản ngắn.
Kể từ bản 1.5.0 beta, TypeScript chưa hỗ trợ Bản đồ . Nó cũng không phải là một phần của lộ trình .
Giải pháp tốt nhất hiện tại là một đối tượng có khóa và giá trị được gõ (đôi khi được gọi là hashmap). Đối với một đối tượng có khóa loại string
và giá trị loại number
:
var arr : { [key:string]:number; } = {};
Một số hãy cẩn thận, tuy nhiên:
string
hoặcnumber
Với ví dụ trên:
// OK:
arr["name"] = 1; // String key is fine
arr[0] = 0; // Number key is fine too
// Not OK:
arr[{ a: "a" }] = 2; // Invalid key
arr[3] = "name"; // Invalid value
map Map<string,string>=new Map<string,string>()
khi tôi map.set(something)
gặp một ngoại lệ map is undefined
, có cách nào khác để khởi tạo nó không?
Xem bình luận trong: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
TypeScript không đi kèm với pollyfill tích hợp. tùy thuộc vào bạn quyết định sử dụng pollyfill nào, nếu có. bạn có thể sử dụng một cái gì đó như es6Collection , es6-shims , corejs ..etc . Tất cả các trình biên dịch Typecript cần là một khai báo cho các cấu trúc ES6 mà bạn muốn sử dụng. bạn có thể tìm thấy tất cả trong tập tin lib này .
đây là phần có liên quan:
interface Map<K, V> { clear(): void; delete(key: K): boolean; entries(): IterableIterator<[K, V]>; forEach(callbackfn: (value: V, index: K, map: Map<K, V>) => void, thisArg?: any): void; get(key: K): V; has(key: K): boolean; keys(): IterableIterator<K>; set(key: K, value?: V): Map<K, V>; size: number; values(): IterableIterator<V>; [Symbol.iterator]():IterableIterator<[K,V]>; [Symbol.toStringTag]: string; } interface MapConstructor { new <K, V>(): Map<K, V>; new <K, V>(iterable: Iterable<[K, V]>): Map<K, V>; prototype: Map<any, any>; } declare var Map: MapConstructor;
Đây là một ví dụ:
this.configs = new Map<string, string>();
this.configs.set("key", "value");
TS2304
, vui lòng kiểm tra điều này: stackoverflow.com/questions/39416691/NH
Có Bản đồ hiện có sẵn trong bản thảo .. nếu bạn xem trong lib.es6.d.ts, bạn sẽ thấy giao diện:
interface Map<K, V> {
clear(): void;
delete(key: K): boolean;
forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void,thisArg?: any): void;
get(key: K): V | undefined;
has(key: K): boolean;
set(key: K, value: V): this;
readonly size: number;}
Thật tuyệt khi sử dụng làm từ điển chuỗi, cặp đối tượng .. điều khó chịu duy nhất là nếu bạn đang sử dụng nó để gán giá trị ở nơi khác với Map.get (khóa) thì IDE như Code cung cấp cho bạn các vấn đề về việc không thể xác định được .. thay vì tạo một biến với một kiểm tra được xác định .. chỉ cần bỏ kiểu (giả sử bạn biết chắc rằng bản đồ có cặp khóa-giá trị)
class myclass {
mymap:Map<string,object>
...
mymap = new Map<string,object>()
mymap.set("akey",AnObject)
let objectref = <AnObject>mymap.get("akey")
Làm cách nào để khai báo loại Bản đồ ES6 trong bản thảo?
Bạn cần phải nhắm mục tiêu --module es6
. Điều này thật đáng tiếc và bạn có thể nêu lên mối quan tâm của mình tại đây: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111
Tối thiểu:
tsconfig:
"lib": [
"es2015"
]
và cài đặt một polyfill như https://github.com/zloirock/core-js nếu bạn muốn hỗ trợ IE <11: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Bản đồ
Không chắc đây có phải là chính thức hay không nhưng điều này có hiệu quả với tôi trong bản thảo 2.7.1:
class Item {
configs: Map<string, string>;
constructor () {
this.configs = new Map();
}
}
Trong đơn giản Map<keyType, valueType>
Với tùy chọn lib config, bạn có thể chọn Bản đồ vào dự án của mình. Chỉ cần thêm es2015.collection
vào phần lib của bạn. Khi bạn không có lib config, hãy thêm một cái với mặc định và thêmes2015.collection
.
Vì vậy, khi bạn có mục tiêu: es5, hãy thay đổi tsconfig.json thành:
"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],
Bản đánh máy chưa hỗ trợ Map
.