1 数组 VS 元组

1.1 数组定义

TypeScript 中数组是某一类型数据的集合(将任意值类型 any 与联合类型 Union 看作一个类型的情况下)但并不规定类型顺序,如:

  1. // ERROR: 不能将类型“string”分配给类型“number”。
  2. let numArr: number[] = [0, 1, '2'];
  3. // ERROR: 不能将类型“boolean”分配给类型“string | number”。
  4. let numstrArr: (number | string)[] = [0, 1, '2', 3, true];
  5. // 与类型顺序无关
  6. let numstrArr1: (number | string)[] = ['0', 1, 2, '3'];

1.2 元组定义

元组 Tuple 是在有限长度内限制了类型顺序的数组,如:

  1. // 定义元组 Tuple
  2. let cat: [string, number];
  3. // 元组赋值
  4. // ERROR: 不能将类型“[string]”分配给类型“[string, number]”。
  5. // ERROR: 源具有 1 个元素,但目标需要 2 个。
  6. cat = ['tom'];
  7. // ERROR: 不能将类型“number”分配给类型“string”。
  8. // ERROR: 不能将类型“string”分配给类型“number”。
  9. cat = [1, 'tom'];
  10. // 正确赋值
  11. cat = ['tom', 1];
  12. // 访问元组元素
  13. cat[0].slice(0);
  14. cat[1].toFixed(2);
  15. cat[0] = 'tony';
  16. cat[1] = 2;
  17. // ERROR: 不能将类型“number”分配给类型“string”。
  18. cat[0] = 1;
  19. // ERROR: 不能将类型“string”分配给类型“number”。
  20. cat[1] = 'tom';

2 元组越界

元组 Tuple 在有限长度内限制了类型顺序,而越界元素则会被当做联合类型处理不再限制类型顺序,如:

  1. let cat: [string, number];
  2. cat = ['tom', 1];
  3. // 后面都是越界元素
  4. cat.push('tony');
  5. cat.push(2);
  6. cat.push(3);
  7. cat.push('bob');
  8. cat.push(true); // ERROR: 类型“boolean”的参数不能赋给类型“string | number”的参数。