ts总结4、TypeScript 数组

一、TS中的数组类型:所有成员的类型必须相同,但是数据量可以是无限量的,当然也可以是零成员
二、Ts数组写法

数组的第一种写法:

// 第一种:在数组成员的类型后面,加上一对方括号。

let arr:number[] = [1,2,3];// 
上例解析:数组arr的类型是number[],其中number表示数组成员类型是number。



复杂的可以写成下面这种
let arr:(number|string)[]
注意:圆括号是必须的,否则因为竖杠|的优先级低于[],TypeScript 会把number|string[]理解成
number和string[]的联合类型。

数组的第二种写法:

// 第二种:数组类型的第二种写法是TS内置的Array接口

let arr:Array<number> = [1,2,3];
数组arr的类型是Array<number>,其中number表示成员类型必须是number,这种对于复杂的数组可读
性稍好一些

let arr:Array<number|string>; // 这种写法本质上属于泛型,

注意:

1、数组类型声明了以后,成员数量是不限制的,任意数量的成员都可以,也可以是空数组。也就是说数组的成员是可以动态变化的。

let arr:number[] = [1, 2, 3];

arr[3] = 4;
arr.length = 2;

arr // [1, 2]


// 正是由于成员数量可以动态变化,所以 TypeScript 不会对数组边界进行检查,越界访问数组并不会报错。
let arr:number[] = [1, 2, 3];
let foo = arr[3]; // 正确:变量foo的值是一个不存在的数组成员,TypeScript 并不会报错

2、TypeScript 允许使用方括号读取数组成员的类型

type Names = string[];
type Name = Names[0]; // string



由于数组成员的索引类型都是number;所以读取成员类型也可以这样写
type Names = string[];
type Name = Names[number]; // string
上例中,Names[number]表示数组Names所有数值索引的成员类型,所以返回string。
二、数组的类型推断

1、如果数组变量没有声明类型,Ts就会推断数组成员的类型,推断时因为值的不同而有所不同(示例如下)

2、如果变量的初始值是空数组,那么 TypeScript 会推断数组类型是any[]。(示例如下)

3、但是

    const arr = [];      / / 推断类型为  any[]

    arr.push(123);    / / 推断类型为   number[]

    arr.push('abc');/ / 推断类型为   (string|number)[]

     上述示例中初始为空数组,然后添加新成员,TypeScript 会自动更新类型推断;但是类型推断的自动更新只发生在初始值为空数组的情况,如果初始值不是空数组,类型推断就不会更新

      const arr = [1,2,3];

      arr.push('abc'); // 报错:初始值123推断数组成员类型为number;下面添加的abc字符串不是number类型

三、只读数组和const断言

        1、有时需要数组是只读的,即不允许变动数组的成员——方法是在数组类型前面加上readonly关键字

const arr:readonly number[] = [1,2];

arr.push(3); // 报错
delete arr[0]; // 报错
arr[1] = 2; // 报错

// 上述的数组是只读的,所以增删改数组成员都会报错

TypeScript 将readonly number[]与number[]视为两种不一样的类型,number[]其实是readonly number[]的子类。因为只读数组没有pop()、push()等改变数组的方法,所以number[]方法数量多于readonly number[]

注意:

         1.由于只读数组是数组的父类型,所以它不能代替数组  

         2.readonly关键字不能与数组的泛型写法一起使用 

         const arr:readonly Array<number> = [0, 1]; // 报错

          3.TypeScript 提供了两个专门的泛型,用来生成只读数组的类型

const a1:ReadonlyArray<number> = [0, 1];

const a2:Readonly<number[]> = [0, 1];

两者尖括号里面的写法不一样,Readonly<T[]>的尖括号里面是整个数组(number[]),而ReadonlyArray<T>的尖括号里面是数组成员(number)。

只读数组还有一种声明方法,就是使用“const 断言”。

四、多维数组

Ts使用T[][]的形式表示二维数组T最底层数组成员的类型

var multi:number[][] = [[1,2,3], [23,24,25]];

// 上述mulit变量的类型是number[][]; 是一个二维数组最底层数组成员类型是number

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值