- 定义数组类型的多种方式
- 【类型 + 方括号】
- 【泛型】
- 【接口】
- 使用【类型 + 方括号】定义数组类型
**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]
// ok
arr[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)
// ok
sum(1) // 1
// ok
sum(1, 2) // 3
// ok
sum(1, 2, 3) // 6
// error 类型“string”的参数不能赋给类型“number”的参数。
sum(1, 2, '3')