string [] === Array<string>
number[] === Array<number>
原因就在于 Array 是泛型的数据结构 类似的还有 Map<K, V> Set, Promise
它描述的是不能改变的数组类型,当函数使用 ReadonlyArray 数组时候就表明了函数不会 对数组做出修改可以放心使用
const nolengthArray: ReadonlyArray<string> = ['red', 'green', 'blue']
也可以使用这样的写法 readonly Type[]
const nolengthArray: readonly string[] = ['1', 'oo', 'kk']
值得注意的是Array
和 ReadonlyArray
两者不能双向赋值
let x: readonly string[] = ['a', 'b', 'c']
let y: string[] = ['string', 'true', '0']
x = y // 可以
y = x // 不可以
元素是另一种 Array 类型 当数组包含个数明确 每个位置的元素类型相同就可以使用元组 类型
type StringNumberPair = [string, number]
获取元组长度之外的元素就会抛错
可以对其使用 数组结构语法
function doSometing(str: [string, number]) {
const [inputString, hash] = str
console.log(inputString)
console.log(hash)
}
元组类型种可以原则一个可选属性,可选属性后必须放在最后,而且会影响到其长度
type Either = [number, number, number?]
function setCoordinate(coord: Either) {
// 这个时候 这个元组的长度就在 2-3 取决于参数 coord
consst[(x, y, z)] = coord
}
元素可以使用剩余语法 但必须是 array/tuple 类型
type StringNumberBoolean = [string, number, ...boolean[]]
const array = (readonly[(string, number)] = ['hellow', 1])
大部分的情况下 元组只被创建,用完后也不会修改所以尽可能的将元组设置为 readonly
是一个好习惯
之前使用 const arr = [3, 4] as const
就是将数组转化成了 readonly 元组
需要注意的是
let x: readonly string[] = []
x = ['a', '1']
这样使用不会报错 这符合 let 的性质 let 声明的变量可以进行二次的赋值操作 let 声明 的是复杂类型 会在栈中保存在堆中开辟的用来存储复杂类型的地址。
一般在声明这些不可变的变量时候建议使用 const 语法
联合类型通俗来讲就是多个类型的合并类型
function printName(name: string | number) {
console.log(name)
}
联合类型是由多个类型组合的对每个类型也可以进行不同的操作 这个时候就要 类型收窄
当 TypeScript 可以根据代码的结构推断出一个更加具体的类型时,类型收窄就会出现。
function printName(name: string | number) {
if (typeof name === 'string') {
console.log(name.slice(0, 3))
} else {
console.log(Math.man(0, number))
}
}