Skip to content

Latest commit

 

History

History
122 lines (83 loc) · 2.81 KB

数组、元组、联合.md

File metadata and controls

122 lines (83 loc) · 2.81 KB

Array 类型

string [] === Array<string>

number[] === Array<number>

原因就在于 Array 是泛型的数据结构 类似的还有 Map<K, V> Set, Promise

ReadonlyArray 类型

它描述的是不能改变的数组类型,当函数使用 ReadonlyArray 数组时候就表明了函数不会 对数组做出修改可以放心使用

const nolengthArray: ReadonlyArray<string> = ['red', 'green', 'blue']

也可以使用这样的写法 readonly Type[]

const nolengthArray: readonly string[] = ['1', 'oo', 'kk']

值得注意的是ArrayReadonlyArray 两者不能双向赋值

let x: readonly string[] = ['a', 'b', 'c']

let y: string[] = ['string', 'true', '0']

x = y // 可以

y = x // 不可以

元组类型 Tuple Array

元素是另一种 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[]]

readonly 元组类型

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))
  }
}