7、Map 对象
Map 对象保存键值对,并且能够记住键的原始插入顺序。
任何值(对象或者原始值) 都可以作为一个键或一个值。
Map 是 ES6 中引入的一种新的数据结构,可以参考 ES6 Map 与 Set。
7.1、创建 Map
创建初始化 Map,可以以数组的格式来传入键值对:
let myMap = new Map([
["key1", "value1"],
["key2", "value2"]
]);
Map 相关的函数与属性:
map.clear()
– 移除 Map 对象的所有键/值对 。map.set()
– 设置键值对,返回该 Map 对象。map.get()
– 返回键对应的值,如果不存在,则返回 undefined。map.has()
– 返回一个布尔值,用于判断 Map 中是否包含键对应的值。map.delete()
– 删除 Map 中的元素,删除成功返回 true,失败返回 false。map.size
– 返回 Map 对象键/值对的数量。map.keys()
- 返回一个 Iterator 对象, 包含了 Map 对象中每个元素的键 。map.values()
– 返回一个新的Iterator对象,包含了Map对象中每个元素的值 。
let nameSiteMapping = new Map();
// 设置 Map 对象
nameSiteMapping.set("Google", 1);
nameSiteMapping.set("Runoob", 2);
nameSiteMapping.set("Taobao", 3);
// 获取键对应的值
console.log(nameSiteMapping.get("Runoob")); // 2
// 判断 Map 中是否包含键对应的值
console.log(nameSiteMapping.has("Taobao")); // true
console.log(nameSiteMapping.has("Zhihu")); // false
// 返回 Map 对象键/值对的数量
console.log(nameSiteMapping.size); // 3
// 删除 Runoob
console.log(nameSiteMapping.delete("Runoob")); // true
console.log(nameSiteMapping);//Map { 'Google' => 1, 'Taobao' => 3 }
// 移除 Map 对象的所有键/值对
nameSiteMapping.clear(); // 清除 Map
console.log(nameSiteMapping);//Map {}
7.2、迭代 Map
TypeScript使用 for...of
来实现迭代:
let nameSiteMapping = new Map();
nameSiteMapping.set("Google", 1);
nameSiteMapping.set("Runoob", 2);
nameSiteMapping.set("Taobao", 3);
// 迭代 Map 中的 key
for (let key of nameSiteMapping.keys()) {
console.log(key);
}
// Google
// Runoob
// Taobao
// 迭代 Map 中的 value
for (let value of nameSiteMapping.values()) {
console.log(value);
}
// 1
// 2
// 3
// 迭代 Map 中的 key => value
for (let entry of nameSiteMapping.entries()) {
console.log(entry[0], entry[1]);
}
// Google 1
// Runoob 2
// Taobao 3
// 使用对象解析
for (let [key, value] of nameSiteMapping) {
console.log(key, value);
}
// Google 1
// Runoob 2
// Taobao 3
使用 es6 编译:
tsc --target es6 test.ts
8、元组
我们知道数组中元素的数据类型都一般是相同的(any[] 类型的数组可以不同),如果存储的元素数据类型不同,则需要使用元组。
元组中允许存储不同类型的元素,元组可以作为参数传递给函数。
8.1、定义 访问元组
var mytuple = [10,"Runoob"]; // 创建元组
console.log(mytuple[0]) //10
8.2、元组运算
push() 向元组添加元素,添加在最后面。
pop() 从元组中移除元素(最后一个),并返回移除的元素。
var mytuple = [10,"Hello","World","typeScript"];
console.log("添加前元素个数:"+mytuple.length) // 返回元组的大小,4
mytuple.push(12) // 添加到元组中
console.log("添加后元素个数:"+mytuple.length) // 添加后元素个数:5
console.log("删除前元素个数:"+mytuple.length) // 删除前元素个数:5
console.log(mytuple.pop()+" 元素从元组中删除") // 删除并返回删除的元素 12
console.log("删除后元素个数:"+mytuple.length) // 删除后元素个数:4
8.3、解构元组
var a =[10,"Runoob"]
var [b,c] = a
console.log( b ) // 10
console.log( c ) // Runoob
9、 联合类型
联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。
注意:只能赋值指定的类型,如果赋值其它类型就会报错。
var val:string|number
val = 12
console.log("数字为 "+ val) // 数字为 12
val = "Runoob"
console.log("字符串为 " + val) // 字符串为 Runoob
将联合类型作为函数参数使用:
function disp(name:string|string[]) {
if(typeof name == "string") {
console.log(name)
} else {
var i;
for(i = 0;i<name.length;i++) {
console.log(name[i])
}
}
}
disp("Runoob") // Runoob
console.log("输出数组....") // 输出数组....
disp(["Runoob","Google","Taobao","Facebook"])
//Runoob
//Google
//Taobao
//Facebook
10、 TypeScript 接口
接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。
10.1、联合类型和接口
interface IPerson {
firstName:string,
lastName:string,
sayHi: ()=>string
commandline:string[]|(()=>string);
}
var customer:IPerson = {
firstName:"Tom",
lastName:"Hanks",
sayHi: ():string =>{
return "Hi there",
commandline:()=>{
return "**Hello World**";}}
}
console.log("Customer 对象 ") // Customer 对象
console.log(customer.firstName) // Tom
console.log(customer.lastName) // Hanks
console.log(customer.sayHi()) //Hi there
console.log(customer.commandline()) //**Hello World**
var employee:IPerson = {
firstName:"Jim",
lastName:"Blakes",
sayHi: ():string =>{return "Hello!!!",
commandline:["Hello","World"]}
}
console.log("Employee 对象 ") // Employee 对象
console.log(employee.firstName) // Jim
console.log(employee.lastName) // Blakes
console.log(customer.commandline()) //Hello
//World
10.2、接口和数组
接口中我们可以将数组的索引值和元素设置为不同类型,索引值可以是数字或字符串。
interface namelist {
// 索引值是number,值是string
[index:number]:string
}
// 类型一致,正确
var list2:namelist = ["Google","Runoob","Taobao"]
// 错误元素 1 不是 string 类型
// var list2:namelist = ["Runoob",1,"Taobao"]
interface ages {
// inde 是string 值是number
[index:string]:number
}
var agelist:ages;
// 类型正确
agelist["runoob"] = 15
// 类型错误,输出 error TS2322: Type '"google"' is not assignable to type 'number'.
// agelist[2] = "google"
10.3、多继承实例
interface IParent1 {
v1:number
}
interface IParent2 {
v2:number
}
interface Child extends IParent1, IParent2 {
}
var Iobj:Child = {
v1:12, v2:23}
console.log("value 1: "+Iobj.v1+" value 2: "+Iobj.v2) // value 1: 12 value 2: 23