TypeScript入门到精通——TypeScript类型系统基础——数组类型

数组类型

  数组是十分常用的数据结构,它表示一组有序元素的集合。在 TypeScript中,数组值的数据类型为数组类型。

一、数组类型定义

  TypeScript 提供了以下两种方式来定义数组类型:

    • 简单数组类型表示法
    • 泛型数组类型表示法

1.1、简单数组类型表示法

在TypeScript中,你可以使用数组类型表示法来定义一个数组的类型。这是一个基础的方法,直接定义数组元素的类型。

例如,如果我们想要定义一个只包含字符串类型元素的数组,我们可以这样做:

let strArray: string[] = ["Hello", "World"];

在这个例子中,string[]是一个数组类型,它包含的元素都是string类型。

1.2、泛型数组类型表示法

  TypeScript也支持泛型数组类型的表示法。这种类型的数组可以接受的元素类型更为广泛。在泛型数组类型中,我们需要提供一个类型参数,这个参数将作为数组元素的类型。

  例如,如果我们想要定义一个可以接受任何类型的元素的数组,我们可以使用any类型参数:

let anyArray: Array<any> = [1, "Hello", true, null, undefined];

  在这个例子中,Array<any>是一个泛型数组类型,它可以接受任何类型的元素。

  除此之外,我们也可以使用其他类型作为类型参数,例如对象类型、接口类型等。例如,我们可以定义一个对象数组,这个对象具有特定的属性: 

interface Person {  
    name: string;  
    age: number;  
}  
  
let people: Person[] = [  
    { name: "Alice", age: 20 },  
    { name: "Bob", age: 30 },  
];

  在这个例子中,Person[]是一个对象数组类型,它包含的元素都是Person类型的对象。每个Person类型的对象都有nameage两个属性,类型分别为stringnumber。 

1.3、简单数组类型和泛型数组类型的区别是什么

  简单数组类型和泛型数组类型的主要区别在于它们能够容纳的元素类型的范围。

  简单数组类型,如int[],它只能容纳一种特定类型的元素,即整数。如果你尝试添加其他类型的元素(如字符串或布尔值),那么在编译时将会出错。

  泛型数组类型,如Array<T>,则更为灵活。这里的                                                                        T可以是任何类型,包括简单类型(如string或number)和复杂类型(如Person或Object)。这意味着你可以将任何类型的元素添加到泛型数组中,只要这些元素符合你为T指定的类型。

  因此,你可以根据需要选择使用哪种数组类型。如果数组元素的类型是固定的,那么简单数组类型可能是更好的选择。如果需要存储多种类型的元素,或者元素类型可能是变化的,那么泛型数组类型就更为合适了。

二、只读数组

  只读数组与常规数组的区别在于,只读数组仅允许程序读取数组元素而不允许修改数组元素。

  TypeScript 提供了以下三种方式来定义一个只读数组

1、ReadonlyArray<T>:这是TypeScript的一个内置类型,用于表示只读数组。T是数组中元素的类型。例如:

let readonlyArray: ReadonlyArray<string> = ['Alice', 'Bob'];

  在上面的代码中,readonlyArray是一个只读字符串数组。如果你尝试修改这个数组(例如,尝试添加或删除元素),TypeScript编译器会抛出错误。

2、readonly修饰符:从TypeScript 3.4开始,你可以使用readonly修饰符来定义只读数组:

let readonlyArray: ReadonlyArray<string> = readonly ['Alice', 'Bob'];

  这种方式与使用ReadonlyArray<T>的效果是相同的,但语法更简洁。

3、Readonly<T>:这是 TypeScript的一个工具类型,用于将任何类型转换为只读类型。例如:
type Readonly<T> = {
    readonly [P in keyof T]: T[P]    ;
};

  由于 TypeScript 3.4 支持了使用 readonly 修饰符来定义只读数组,所以从 TypeScript 3.4 开始可以使用 "Readonly<T>"工具类型来定义只读数组。

  需要注意的是,只读数组并不意味着你不能对其进行迭代或使用一些数组方法(例如mapfilter等)。它只是限制了你不能改变数组的结构(例如添加或删除元素)。

三、数组对象

我们也可以使用数组对象创建数组。

Array 对象的构造函数接受以下两种值:

    • 表示数组大小的数值。
    • 初始化的数组列表,元素使用逗号分隔值。

3.1、指定数组初始化大小

var arr_names:number[] = new Array(4)  
 
for(var i = 0; i<arr_names.length; i++) { 
        arr_names[i] = i * 2 
        console.log(arr_names[i]) 
}

  输出结果:

0 2 4 6

3.2、初始化数组列表,元素使用逗号分隔

var sites:string[] = new Array("Google","Runoob","Taobao","Facebook") 
 
for(var i = 0;i<sites.length;i++) { 
        console.log(sites[i]) 
}

  输出结果:

Google
Runoob
Taobao
Facebook

四、数组解构

  TypeScript的数组解构是一种语法,允许你将数组的元素提取到独立的变量中。通过解构,你可以将数组的每个元素分配给一个单独的变量,以便在代码中更方便地使用这些值。

  下面是 TypeScript 中数组解构的基本语法:

let [variable1, variable2, variable3] = array;

  在这个例子中,array是一个包含三个元素的数组,而variable1variable2variable3是你希望分配给这三个元素的变量。通过使用数组解构语法,你可以将数组的元素赋值给这些变量。

  除了将数组的元素分配给单独的变量,你还可以使用解构语法提取数组中的特定索引位置的元素。例如,如果你只想提取数组的第一个元素,可以这样做:

let [variable1] = array;

  你还可以将数组中的元素分配给一个新数组。例如:

let [variable1, variable2, variable3] = array;  
let newArray = [variable1, variable2, variable3];  

  另外,你可以使用解构语法提取数组中的第一个元素,并将其余的元素存储在一个新数组中。例如:

let [firstElement, ...remainingElements] = array;

  在这个例子中,firstElement将被分配给第一个元素,而remainingElements将是一个包含数组剩余元素的新数组。

五、数组迭代

  我们可以使用 for 语句来循环输出数组的各个元素:

var j:any; 
var nums:number[] = [1001,1002,1003,1004] 
 
for(j in nums) { 
    console.log(nums[j]) 
}

  输出结果:

1001
1002
1003
1004

 六、数组方法

常见数组方法选自:https://www.runoob.com/typescript/ts-array.html

  TypeScript是JavaScrip 的一个超集,因此它继承了JavaScript的所有特性,包括数组方法。以下是一些常用的JavaScript数组方法在TypeScript中的使用说明和示例:

序号 数组方法说明 示例
1 concat():用于合并两个或多个数组,不修改原来变量值,并返回结果。

let array1 = [1, 2, 3];

let array2 = [4, 5, 6];

let combined = array1.concat(array2); // [1, 2, 3, 4, 5, 6]

2 every():检测数值元素的每个元素是否都符合条件。
function isBigEnough(element, index, array) {

  return (element >= 10);
}

var passed = [12, 5, 8, 130, 44].every(isBigEnough);
console.log("Test Value : " + passed ); // false

3 filter():检测数值元素,并返回符合条件所有元素的数组。

function isBigEnough(element, index, array) {
  return (element >= 10);
}

var passed = [12, 5, 8, 130, 44].filter(isBigEnough);
console.log("Test Value : " + passed ); // 12,130,44

4 forEach():数组每个元素都执行一次回调函数。 let num = [7, 8, 9];

num.forEach(function (value) {
  console.log(value);
});


编译成 JavaScript 代码:

var num = [7, 8, 9];
num.forEach(function (value) {
  console.log(value); // 7 8 9
});

5 indexOf():搜索数组中的元素,并返回它所在的位置。 如果搜索不到,返回值 -1,代表没有此项。

var index = [12, 5, 8, 130, 44].indexOf(8);
console.log("index is : " + index ); // 2

6 join():把数组的所有元素放入一个字符串。 var arr = new Array("Google","Runoob","Taobao");


var str = arr.join();
console.log("str : " + str ); // Google,Runoob,Taobao

var str = arr.join(", ");
console.log("str : " + str ); // Google, Runoob, Taobao

var str = arr.join(" + ");
console.log("str : " + str ); // Google + Runoob + Taobao

7 lastIndexOf():返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。 var index = [12, 5, 8, 130, 44].lastIndexOf(8);

console.log("index is : " + index ); // 2

8 map():通过指定函数处理数组的每个元素,并返回处理后的数组。

var numbers = [1, 4, 9];

//计算给定数组numbers中每个元素的平方根并将结果存储在roots数组

var roots = numbers.map(Math.sqrt);
console.log("roots is : " + roots ); // roots is : 1,2,3

9 pop():删除数组的最后一个元素并返回删除的元素。

var numbers = [1, 4, 9];

var element = numbers.pop();
console.log("element is : " + element ); // 9

var element = numbers.pop();
console.log("element is : " + element ); // 4

10 push():向数组的末尾添加一个或更多元素,并返回新的长度。 var numbers = new Array(1, 4, 9);

var length = numbers.push(10);
console.log("new numbers is : " + numbers ); // 1,4,9,10
length = numbers.push(20);
console.log("new numbers is : " + numbers ); // 1,4,9,10,20

11 reduce():将数组元素计算为一个值(从左到右)。 var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });

console.log("total is : " + total ); // 6

12 reduceRight():将数组元素计算为一个值(从右到左)。 var total = [0, 1, 2, 3].reduceRight(function(a, b){ return a + b; });

console.log("total is : " + total ); // 6

13 reverse():反转数组的元素顺序。 var arr = [0, 1, 2, 3].reverse();

console.log("Reversed array is : " + arr ); // 3,2,1,0

14 shift():删除并返回数组的第一个元素。 var arr = [10, 1, 2, 3].shift();

console.log("Shifted value is : " + arr ); // 10

15 slice():选取数组的的一部分,并返回一个新数组。

var arr = ["orange", "mango", "banana", "sugar", "tea"];
console.log("arr.slice( 1, 2) : " + arr.slice( 1, 2) ); // mango
console.log("arr.slice( 1, 3) : " + arr.slice( 1, 3) ); // mango,banana

16 some():检测数组元素中是否有元素符合指定条件。 function isBigEnough(element, index, array) {

return (element >= 10);

}

var retval = [2, 5, 8, 1, 4].some(isBigEnough);
console.log("Returned value is : " + retval ); // false

var retval = [12, 5, 8, 1, 4].some(isBigEnough);
console.log("Returned value is : " + retval ); // true

17 sort():对数组的元素进行排序。 var arr = new Array("orange", "mango", "banana", "sugar");

var sorted = arr.sort();
console.log("Returned string is : " + sorted ); // banana,mango,orange,sugar

18 splice():从数组中添加或删除元素。

var arr = ["orange", "mango", "banana", "sugar", "tea"];

 

//arr.splice(2, 0, "water"):这个方法从数组的第三个位置(索引为2)开始,删除0个元素,然后添加"water"。因此,"water"被插入到"banana"之前,而"banana"及其之后的元素没有被移动。

var removed = arr.splice(2, 0, "water");
console.log("After adding 1: " + arr ); // orange,mango,water,banana,sugar,tea
console.log("removed is: " + removed);


//arr.splice(3, 1):这个方法从数组的第四个位置(索引为3)开始,删除1个元素。因此,"sugar"被移除,而"tea"及其之前的元素没有被移动。

removed = arr.splice(3, 1);
console.log("After removing 1: " + arr ); // orange,mango,water,sugar,tea
console.log("removed is: " + removed); // banana

19 toString():把数组转换为字符串,并返回结果。 var arr = new Array("orange", "mango", "banana", "sugar");

var str = arr.toString();
console.log("Returned string is : " + str ); // Returned string is : orange,mango,banana,sugar

 20 unshift():向数组的开头添加一个或更多元素,并返回新的长度。 var arr = new Array("orange", "mango", "banana", "sugar");

var length = arr.unshift("water");
console.log("Returned array is : " + arr ); // water,orange,mango,banana,sugar
console.log("Length of the array is : " + length ); // 5

posted @ 2023-10-07 10:22  左扬  阅读(865)  评论(0编辑  收藏  举报
levels of contents