TypeScript基礎類型介紹

TS 的靜態類型可以人為的分為兩類:

基礎類型:像佈爾值(boolean)、數字(number)、字符串(string)、Any(任意類型)、Void(無類型)、NullUndefinedNever(無值類型)

對象類型:像數組、函數、對象、枚舉、元組。

1.基礎類型

TS的類型定義主要通過以下示例代碼中演示的方式進行定義:

;(function () {
  /*
   * 在 TS 中可以通過 let 變量名: 數據類型 = 變量值值得方式定義數據類型(類型註解)
   * 也可以在定義的時候不指定數據類型,TS 自身會推斷該數據類型
   */
  // 佈爾型
  let boo: boolean = false // 賦值非佈爾值將會拋出異常

  // 數字類型
  let num: number = 100

  // 字符串
  let str: string = '字符串' // 使用單引號或者雙引號定位
  str = `模板字符串` // 使用模板字符串定義

  // Any 類型 -> 表示該類型可以為動態的類型,該類型在編譯的時候移除瞭類型檢查
  let AnyType: any = 123
  AnyType = true // 重復賦值不會拋出異常

  // Void 類型 -> 通常用於沒有返回值的函數類型
  function demo(): void {
    console.log('測試void類型')
  }
  demo()

  // 還有兩個比較特殊的類型,就是 null 和 undefined
  // 這兩個類型是所有類型的子類型,也就是說可以將這兩個兩個類型賦值給 number、string 等類型
  let u: undefined = undefined
  num = u // 將 number 類型的變量賦值為 undefined
  let n: null = null
  boo = n // 將 boolean 類型的變量賦值為 null
})()

基礎類型比較簡單,特別類似於JavaScript,簡單看來就是比JavaScript多瞭一個類型定義

TS 中還有一個Never類型。該類型表示的是那些永遠不會存在的值得類型。

例如:never類型是那些總是會拋出異常或根本就不會有返回值的函數表達式或箭頭函數表達式的返回值類型。

2.對象類型

2.1數組

TS中的數組不同於JS中的數組,在TS中使用數組不僅可以將一個變量定義為數組,也可以定位數組中的類型。

示例代碼如下所示:

;(function () {
  // 定義一個僅僅為數字的數組類型
  let arr1: number[] = [1, 2, 3]
  console.log(arr1)
  // 定義一個可以為 數字 字符串 佈爾值的數組
  let arr2: (number | string | boolean)[] = ['1', '2', true]
  console.log(arr2)
  // 定義一個任意類型的數組
  let arr3 = [1, ['1', '2', true], true]
  console.log(arr3)

  // 定義個對象類型的數組,對象中必須有 name 和 age 兩個屬性
  const objectArray: { name: string; age: number }[] = [
    { name: '一碗周', age: 18 },
  ]
  // 或者通過 type alias 類型別名的方式聲明
  // 通過 type 定義一個類型別名
  type User = { name: string; age: number }
  const objectArr: User[] = [{ name: '一碗周', age: 18 }]
})()

2.2元組

元組類型允許表示一個已知元素數量和類型的數組,各元素的類型不必相同。

示例代碼如下所示:

;(function () {
  // 定義一個值分別被 string 和 number 的元組
  let tuple: [string, number] = ['123', 123]
  console.log(tuple) // [ '123', 123 ]
  // 通過索引賦值
  tuple[0] = 'string'
  console.log(tuple) // [ 'string', 123 ]
  // 賦值其他類型
  // tuple[0] = true
  // console.log(tuple) // 拋出異常
})()

元組的主要作用就是約束數組中的每一項,及其數組的長度。

元組和數組是可以可以嵌套的,語法結構如下所示:

// 元組和數組的嵌套
let tuples: [string, number][] = [
    ['123', 123],
    ['456', 456],
]

上面的代碼中,[string, number]表示一個元組,在後面增加[],就表示這個一個存放元組的數組。

2.3對象

一個對象中可以包含以上所有的類型,示例代碼如下所示:

;(function () {
  // 定義一個對象,裡面包含 MyName 和 age 兩個屬性,其中 MyName 為 string 類型 age 為number 類型
  let obj: {
    MyName: string
    age: number
  }
  // 對象的賦值,如果不按上面指定的類型進行賦值會拋出異常
  obj = {
    MyName: '一碗周',
    age: 18,
  }
  console.log(obj) // { MyName: '一碗周', age: 18 }
})()

在TS中我們並不需要在每個地方標註類型,因為類型推斷 可以幫助我們在不編寫額外代碼的,即可獲得其功能。但是你想讓你的代碼可讀性更好一些,可以寫上每個的類型。

3.類型推斷

在TypeScript中有的時候並需要明確指定類型,編譯器會自動推斷出合適的類型,比如下面這段代碼:

;(function () {
  let myName = '一碗周'
  myName = true // 錯誤:不能將類型“boolean”分配給類型“string”
})()

我們定義myName變量時,並沒有指定其數據類型,隻是為他賦瞭一個字符串的值,但是我們如果將這個值重新賦值為要給非string類型的值時,編譯器將會拋出異常。

這就是TypeScript中最簡單的類型推斷,根據右側的值來推測變量的數據類型。

3.1類型聯合中的類型推斷

什麼是類型聯合請參考:聯合類型、交叉類型和類型保護

若一個變量可能具有多個類型的值時,TypeScript 會將多個類型合並起來,組成一個聯合類型,

示例代碼如下:

let arr = [1, '2'] // 定義一個包含字符串和數字的一個數組
// 為上面定義的數組重新賦值
// arr = [true, false] // 錯誤 不能將類型“boolean”分配給類型“string | number”

// 還有如下例子
let val = arr.length === 0 ? 0 : '數組長度不是0'
// val = false //  錯誤 不能將類型“boolean”分配給類型“string | number”


3.2上下文類型

在這之前介紹的例子可能都是按照=右邊的值來推斷=左邊的類型。現在要介紹的上下文類型就與之前的類型推斷不同,編譯器會根據當期變量所處的上下文環境來推斷出變量的類型。

示例代碼如下:

;(function () {
  // 定義一個接口
  interface Person {
    name: string
    age: number
  }
  // 通過上面定義的接口定義一個數組
  let arr: Person[] = [{ name: '一碗周', age: 18 }]
  // 遍歷定義的數組
  arr.forEach(item => {
    // 根據當前所處的環境,編譯器自動推斷出 item 為 hobby 類型且不具有 hobby 屬性
    console.log(item.hobby) // 類型“Person”上不存在屬性“hobby”
  })
})()

在上面的代碼中,我們首先定義瞭一個Person的接口,然後用這個接口定義一個數組,遍歷該數組時編譯器推斷itemPerson類型,所以編譯器拋出異常。

如果我們為函數表達式的參數添加類型註解,上下文類型將會被忽略到,也就不會在報錯瞭。

示例代碼如下:

// 如果在上下文中明確類型信息,上下文將會被忽略。
arr.forEach((item: any) => {
    // 根據當前所處的環境,編譯器自動推斷出 item 為 hobby 類型且不具有 hobby 屬性
    console.log(item.hobby) // 類型“Person”上不存在屬性“hobby”
})

4.類型斷言

所謂的類型斷言就是你來告訴TS這個值得數據類型就是某樣的,你不需要做檢查。

這樣做得話他在運行是不會影響,隻有在編譯的時候回影響。

示例代碼如下:

let SomeValue: any = 'this is a string'
// 語法一
let StrLength1: number = (<string>SomeValue).length
// 語法二 as 語法
let StrLength2: number = (SomeValue as string).length

值得註意的是:在TS中使用JSX時,隻有第二種語法是被支持的。

到此這篇關於TypeScript基礎類型介紹的文章就介紹到這瞭,更多相關TypeScript基礎類型內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: