一、数组类型基础
- 核心特征:所有成员类型必须相同,成员数量动态可变(可空、可无限扩展)。
- 两种声明方式:
- 成员类型 + 方括号:
let arr: number[] = [1, 2, 3]
- 复杂类型需用括号包裹:
let arr: (number|string)[]
(避免 |
优先级问题)。
- 泛型写法:
let arr: Array<number> = [1, 2, 3]
- 复杂类型更易读:
Array<number|string>
。
- 任意类型数组:
any[]
(不推荐,失去类型检查意义)。
二、数组的类型推断
- 空数组初始值:推断为
any[]
,后续添加成员会自动更新类型(如先推 any[]
,加 number
后推 number[]
,再加 string
后推 (number|string)[]
)。 - 非空数组初始值:根据初始成员类型推断,且后续不可添加其他类型成员(如
const arr = [123]
推断为 number[]
,添加 string
会报错)。
三、只读数组与 const 断言
- 只读数组声明:
- 基础写法:
readonly number[]
(禁止修改、新增、删除成员)。 - 泛型写法:
ReadonlyArray<number>
或 Readonly<number[]>
(readonly
不可直接修饰 Array<T>
)。
- 类型关系:
number[]
是 readonly number[]
的子类型(子类型可赋值给父类型,反之不行)。
- 示例:
let a: number[] = [1]; let b: readonly number[] = a
正确;a = b
报错。
- const 断言:
const arr = [0, 1] as const
推断为只读数组,成员不可修改。 - 注意:只读数组作为参数传入普通数组类型的函数时会报错,需用类型断言(如
getSum(arr as number[])
)。
四、多维数组
- 声明方式:用嵌套方括号表示,最内层为成员类型。
示例:let multi: number[][] = [[1, 2], [3, 4]]
(二维数组,底层成员为 number
)。
五、数组成员类型读取
- 通过索引类型读取:
type Names = string[]; type Name = Names[0]
或 Names[number]
,均返回 string
。