- 定义数组类型的多种方式
- 【类型 + 方括号】
- 【泛型】
- 【接口】
- 使用【类型 + 方括号】定义数组类型
**let arr: number[] = [1, 2, 3]**- 推荐使用【类型 + 方括号】的写法来定义数组类型
- 【类型 + 方括号】写法
number[]其实是【泛型】写法Array<number>的语法糖
- 使用【泛型】定义数组类型
let arr: Array<number> = [1, 2, 3]
- 使用【接口】定义数组类型
interface NumberArray { [index: number]: number; }
// 【类型 + 方括号】let arr1: number[] = [1, 2, 3];// 【泛型】let arr2: Array<number> = [1, 2, 3];// 【接口】interface NumberArray {[index: number]: number;}let arr3: NumberArray = [1, 2, 3];
- 数组类型中的每一个成员类型必须保持一致
// error 不能将类型“string”分配给类型“number”。let arr: number[] = [1, '2', 3];
let arr: number[] = [1, 2, 3];// error 类型“string”的参数不能赋给类型“number”的参数。arr.push('8');
- 如果允许数组中出现任意类型,可以使用 any 数组
any[]
let arr: any[] = ['123', 123, { name: 'dahuyou' }];arr.push('abc', [1, 2, 3])
- 数组类型的局限性:越界访问不会报错
let arr: number[] = [1, 2, 3]// okarr[10] // undefined
如果希望 ts 能够在我们越界访问数组成员时报错,可以考虑使用元组类型来实现。
- 类数组(Array-like Object)不是数组类型
- 类数组的类型,不能用普通的描述数组的方式来描述,而应该用接口描述
- 常用的类数组都有自己的接口定义,如 IArguments, NodeList, HTMLCollection 等
function sum() {let args: number[] = arguments;// error 类型“IArguments”缺少类型“number[]”的以下属性: pop, push, concat, join 及其他 26 项。}
interface IArgs {[index: number]: number;length: number;callee: Function;}function sum1() {// ok(不推荐)let args: IArgs = arguments;}function sum2() {// ok(推荐)let args: IArguments = arguments;}
- 剩余参数,本质上是一个数组,可以用约束数组的方式来约束剩余参数
let sum = (...args: number[]) => args.reduce((a, b) => a + b, 0)// oksum(1) // 1// oksum(1, 2) // 3// oksum(1, 2, 3) // 6// error 类型“string”的参数不能赋给类型“number”的参数。sum(1, 2, '3')
