Typescript入门之数组与元组

2,227 阅读5分钟

作为一个小职员,工作多,没提成,人家休假我加班。房贷没还清,保险自己买。不过好在我不用交停车费,因为我根本买不起车。2020年小编决定好好的学习Typescript,提升个人能力,努力赚小钱钱,争取买到一辆自行车(呸,要啥自行车!!!!)。这是小编写的第三篇Typescript学习的文章。

Typescript入门之基本类型(一)

Typescript入门之基本类型(二)

Typescript入门之数组与元组

Typescript入门之接口

数组

提到数组,小编就想起来家里停车场停的跑车了,嗯,第一辆布加迪,第二辆法拉利,第三辆劳斯莱斯,第四辆保时捷...,下面就是小编家里的那个停车场哈

// 停车场
const park: string[] = ['布加迪','法拉利','劳斯莱斯','保时捷']
// 有一天刚从迪拜回来的老爸说,娃,爸刚买了几辆兰博基尼,给你一辆吧,所以,停车场就需要新增一辆车
park.push('兰博基尼')
// 停车场只能停车,你不能把家里保险柜的几个亿放到停车场,所以
// 不能把9999999999美刀放到停车场 Argument of type '9999999999' is not assignable to parameter of type 'string'.
park.push(9999999999)

嗨,醒醒,起来搬砖了。梦做完了,回归正传哈。

数组不仅可以定义string类型,还可以定义number,boolean等等类型

// 美女年龄
const belleAge: number[] = [16,17,18,20]

// 近期彩票中奖情况
const win: boolean[] = [false, false, false ,false ,false, false]

看了上面的写法,同学们可能会疑惑,如果数组里面有不同的值,那是不是不能定义呢?这个是可以定义的,不过需要使用到一个新的概念 联合类型。下面我们定义一个既可以包含字符类型,也可以包含数字类型的数组

// 隔壁测试美眉的信息 姓名,年龄,身高,体重,前男友
const info:  Array<string | number>  =  ['诸葛钢蛋',22,170,50,'于谦']

数组不仅可以包含基础类型,也可以包含对象

type userInfoType =  {
    weight:  number,
    name:  string,
    age: number,
    height: number,
    exBoyFriend: string
}
const user1: userInfoType =  {
    name: '诸葛钢蛋',
    weight: 50,
    age: 22,
    height: 170,
    exBoyFriend: '于谦'
}
const array4: userInfoType[]  =  [user1]

元组

最近喜欢投资,所以在全国各大城市都买了几套房子,但是房子多了,经常就记不清楚了,这不,最近花钱买了一个房屋管理系统,把买的房子记录到管理系统中。每个房子需要维护 所在城市,地址,面积,价格,是否有女主人等信息,用元组表示房子的信息

// 北京市xxx区xx小区xxxxxx 500平米房子,2000w, 有女主人
const house:[string,string,number,number,boolean] = ['北京','北京市xxx区xx小区xxxxxx',500, 2000,true]

// 将所有房子信息都记录下来
type houseTuple = [string,string,number,number,boolean]
// 数组的每一项是一个元组类型
const houses: houseTuple[] = [
   ['北京','北京市xxx区xx小区xxxxxx',500, 2000,true],
   ['北京','北京市xxx区xx小区xxxxxx',600, 3000,true]
]

在对元组进行赋值的时候,不仅元组每项的类型要保持一致,而且元素个数也要保持一致。对元组修改时,可以通过索引进行修改

// 最近房价上涨,原价5000W的房子涨到了5500W, 需要修改一个房子的价格
const house:[string,string,number,number,boolean] = ['北京','北京市xxx区xx小区xxxxxx',500, 2000,true]
house[3] = 5500

有一天我发现所有房子都有女主人了,有些房子面积比较大,可能每层楼都有一个女主人,希望可以记录女主人的个数

const house:[string,string,number,number,boolean] = ['北京','北京市xxx区xx小区xxxxxx',1000, 4000,true]
// 是否可以将是否女主人的值改为女主人的个数
// 报错 Type '2' is not assignable to type 'boolean'.
house[4] = 2

对于元组的每一项来说,都有固定的数据类型,不能给项赋值不对应的类型。因为元组的每一项都有固定的类型,所以可以在元组的项上面调用类型对应的方法

// 判断房子是否在北京市朝阳区
const house:[string,string,number,number,boolean] = ['北京','北京市朝阳区xx小区xxxxxx',1000, 4000,true]
// 地址对应string类型,可以调用startsWith方法
const result = house[1].startsWith('北京市朝阳区')

元组本质上也是数组,所以数组上的操作元组都可以使用,但需要注意的是,如果对数组进行越界操作,越界操作的类型必须包含在元素定义的类型里面

const house:[string,string,number,number,boolean] = ['北京','北京市朝阳区xx小区xxxxxx',1000, 4000,true]
// 添加房子的房产证号码
// 正确 ,可以push string | number 类型
house.push('xxxxxxxxxxxxxxxxxxxx')
// 添加房屋女主人的个人信息
type infoType = {
    name: string,
    age: number
}
const info: infoType = {
    name: '诸葛钢蛋',
    age: 22
}
// 报错 Argument of type 'infoType' is not assignable to parameter of type 'string | number | boolean'.
house.push(info)

如果对元组索引值进行越界操作,在ts2.6之前与之后是不同的,在ts2.6之前,只要通过索引添加的值包含在元组定义的类型里面都是允许的,但在2.6之后是禁止的

const house:[string,string,number,number,boolean] = ['北京','北京市朝阳区xx小区xxxxxx',1000, 4000,true]

// 添加房产证号码
// ts 2.6之前 正确
house[5] = 'xxxxxxxxxxxxxxxxxxxx'

// ts 2.6之后 报错
// 报错 Type '"xxxxxxxxxxxxxxxxxxxx"' is not assignable to type 'undefined'.
house[5] = 'xxxxxxxxxxxxxxxxxxxx'