TS-元组

元组是TypeScript独有的新类型,通常用于表示长度较固定的数组,并可分别指定每个元素的类型。在JavaScript中并没有元组这一概念,TypeScript的元组编译成JavaScript的元组后,代码类型依然是数组,元组更多是在编译过程中起限定作用的,是一种“语法糖”

1.元组的声明和读写

元组的声明方式如下。

let 变量名称: [类型1,类型2,...,类型n] = [值1,值2,...,值n];

以下为元组的声明示例,其中,tuple1拥有两个元素,每个元素均为数值类型,而tuple2拥有3个元素,每个元素的类型都不相同。 

let tuple1: [number, number] = [100, 200];
let tuple2: [string, number, boolean] = ["a", 1, true];

 元组的读写方式与数组完全一致,这里不再讲述。但注意,在修改元组值的时候,其值必须完全等于元组的长度,且对应位置的元素也不能指定为其他类型,例如,除第1行之外,以下代码均会引起编译错误。

let tuple2: [string, number, boolean] = ["a", 1, true];
//编译错误:不能将类型"[string, number]"分配给类型"[string, number, boolean]"。源具有两个
//元素,但目标需要 3 个。ts(2322)
tuple2 = ["a", 1];;
//编译错误:不能将类型"[string, number, true, number]"分配给类型"[string, number, boolean]"。
//源有 4 个元素,但目标仅允许 3 个。ts(2322)
tuple2 = ["a", 1, true, 3];
//编译错误:长度为 "3"的元组类型 "[string, number, boolean]"在索引 "3"处没有元素。ts(2493)
let x = tuple1[3];
 
//编译错误:不能将类型"number"分配给类型"string"。ts(2322)
tuple2 = [1,1,1];
//编译错误:不能将类型"number"分配给类型"string"。ts(2322)
tuple2[0] = 2;

同样地,元组也可以设置为只读元组,只需使用readonly关键字即可,语法如下。

let 变量名称: readonly [类型1,类型2,...,类型n] = [值1,值2,...,值n];

2.可选元素与剩余元素

在声明元组时,将元组尾部的一些元素声明为可选元素,对这些元素可以不设初始值。可选元素的声明方式如下,只需在类型列表中为可选元素加上问号(?)即可。

let 变量名称: [类型1,类型2,...,可选类型1?,可选类型2?,...] = [初始值列表];

可选元素不是必需的,这意味着即使元组缺少可选元素的值,也不会引起编译错误,例如,以下代码均可正常编译。

let tuple1: [number, number, string?, number?] = [100, 200];
tuple1 = [100, 200, "a"];
tuple1 = [100, 200, "a", 400];

设置可选元素依然会限定元组的最小长度及最大长度。如果元组尾部的元素数量不确定,可以使用剩余元素表示。剩余元素的声明方式如下,只需在元组类型声明尾部加上“...类型[]”即可。

let 变量名称: [类型1,类型2,...,类型n,...类型[]] = [初始值列表];

 示例代码如下。其中,除首个元素是数值外,尾部可以传入任意数量的剩余元素。

let tuple1: [number, ...string[]] = [1];
tuple1 = [1, "a"];
tuple1 = [1, "a", "b", "c"];

可选元素和剩余元素可以混合使用,但可选元素必须位于中间,剩余元素必须位于最后。

let tuple1: [number, boolean?, ...string[]] = [1];
tuple1 = [1, true];
tuple1 = [1, true, "a", "b", "c"];

 3.元组的方法

由于元组的本质是数组,仅在编译前加了一些限定,因此数组的所有方法均可在元组上使用,这里不再讲述每种方法。
对于元组来说,任何方法都需要慎用,甚至建议不使用任何方法,因为使用这些方法会使元组绕过编译检查。
例如,以下代码原本通过整体赋值或索引赋值进行编辑,无法绕过关于元组长度限定和类型限定的编译检查。

let tuple2: [string, number, boolean] = ["a", 1, true];
//编译错误:不能将类型"[string, number, true, number]"分配给类型"[string, number, boolean]"。
//源具有 4 个元素,但目标仅允许 3 个。ts(2322)
tuple2 = ["a", 1, true,4];
//编译错误:不能将类型"number"分配给类型"string"。ts(2322)
tuple2[0] = 2;

如果使用元组的方法进行编辑,就可以绕过这些规则,示例代码如下。

let tuple2: [string, number, boolean] = ["a", 1, true];
//以下代码将执行成功,执行后元组为 ["a", 1, true,4]
tuple2.push(4); 
//以下2句代码将执行成功,执行后元组为 [2, 1, true,4]
tuple2.shift();
tuple2.unshift(2);

 4.将元组转换为数组

由于元组本身是数组的子类型,因此可以将元组的值赋给数组,然后作为数组直接使用。但需要注意,这并不是推荐的用法,因为按数组使用后,也会绕过编译检查。例如,在以下代码中,当将元组作为数组使用时,可以动态地添加第三个元素的值,这不会引起编译错误,但作为元组使用时,长度是固定的,会引起编译错误。

let array1:number[];
let tuple1:[number,number] = [1,2]
array1 = tuple1;
array1[2] = 3;
//编译错误:不能将类型"3"分配给类型"undefined"。ts(2322)
tuple1[2] = 3;

元组的值可以赋给数组,但数组的值不能赋给元组,否则会引起编译错误。

let array1:number[] = [1,2];
let tuple1:[number,number];
//编译错误:不能将类型"number[]"分配给类型"[number, number]"。目标仅允许两个元素,但源中的元素
//可能不够。ts(2322)
tuple1 = array1;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值