Bootstrap

typescript Tuple越界元素

结论: typescript 2.7后,元祖长度被固定,访问元祖越界元素会报错,官方文档中的教程尚未更新。

typescript 官方文档中,允许访问一个越界的元素

let  t: [string, number]
t = ['a', 1]

console.log(t[0])   //  a
console.log(t[1])  //  1

// 此处访问越界元素,会使用联合类型替代
t[2] = 2    // 正常
t[8] = 'd'  // 正常
t[9] = false // 报错

但在最近的学习中,发现 t[2] = 2 是会报错的

查阅官方文档,应该是官方文档过旧,所致
2.7 官方文档原文.在这里插入图片描述
大意是 : 2.6 及以前版本中,[number,string,string] 被认为是[number,string] 的子类,
但在元祖使用过程中,此项功能与大部分使用场景冲突,所以2.7之后不允许为元祖设定越界元素。
从概念上讲,你可以认为 [number,string] 等同于

interface NumStrTuple extends Array<number | string> {
  0: number;
  1: string;
  length: 2; // using the numeric literal type '2'
}

如果需要保留元祖仅限制最小长度的功能,可用以下声明替代

interface MinimumNumStrTuple extends Array<number | string> {
  0: number;
  1: string;
}
;