溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣解析TypeScript基礎(chǔ)類型

發(fā)布時(shí)間:2021-12-09 13:20:07 來源:億速云 閱讀:145 作者:柒染 欄目:開發(fā)技術(shù)

怎樣解析TypeScript基礎(chǔ)類型,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

    TS 的靜態(tài)類型可以人為的分為兩類:

    基礎(chǔ)類型:像布爾值(boolean)、數(shù)字(number)、字符串(string)、Any(任意類型)、Void(無類型)、Null、 Undefined、Never(無值類型)

    對(duì)象類型:像數(shù)組、函數(shù)、對(duì)象、枚舉、元組。

    1.基礎(chǔ)類型

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

    ;(function () {
      /*
       * 在 TS 中可以通過 let 變量名: 數(shù)據(jù)類型 = 變量值值得方式定義數(shù)據(jù)類型(類型注解)
       * 也可以在定義的時(shí)候不指定數(shù)據(jù)類型,TS 自身會(huì)推斷該數(shù)據(jù)類型
       */
      // 布爾型
      let boo: boolean = false // 賦值非布爾值將會(huì)拋出異常
    
      // 數(shù)字類型
      let num: number = 100
    
      // 字符串
      let str: string = '字符串' // 使用單引號(hào)或者雙引號(hào)定位
      str = `模板字符串` // 使用模板字符串定義
    
      // Any 類型 -> 表示該類型可以為動(dòng)態(tài)的類型,該類型在編譯的時(shí)候移除了類型檢查
      let AnyType: any = 123
      AnyType = true // 重復(fù)賦值不會(huì)拋出異常
    
      // Void 類型 -> 通常用于沒有返回值的函數(shù)類型
      function demo(): void {
        console.log('測(cè)試void類型')
      }
      demo()
    
      // 還有兩個(gè)比較特殊的類型,就是 null 和 undefined
      // 這兩個(gè)類型是所有類型的子類型,也就是說可以將這兩個(gè)兩個(gè)類型賦值給 number、string 等類型
      let u: undefined = undefined
      num = u // 將 number 類型的變量賦值為 undefined
      let n: null = null
      boo = n // 將 boolean 類型的變量賦值為 null
    })()

    基礎(chǔ)類型比較簡(jiǎn)單,特別類似于JavaScript,簡(jiǎn)單看來就是比JavaScript多了一個(gè)類型定義

    TS 中還有一個(gè)Never類型。該類型表示的是那些永遠(yuǎn)不會(huì)存在的值得類型。

    例如:never類型是那些總是會(huì)拋出異?;蚋揪筒粫?huì)有返回值的函數(shù)表達(dá)式或箭頭函數(shù)表達(dá)式的返回值類型。

    2.對(duì)象類型

    2.1數(shù)組

    TS中的數(shù)組不同于JS中的數(shù)組,在TS中使用數(shù)組不僅可以將一個(gè)變量定義為數(shù)組,也可以定位數(shù)組中的類型。

    示例代碼如下所示:

    ;(function () {
      // 定義一個(gè)僅僅為數(shù)字的數(shù)組類型
      let arr1: number[] = [1, 2, 3]
      console.log(arr1)
      // 定義一個(gè)可以為 數(shù)字 字符串 布爾值的數(shù)組
      let arr2: (number | string | boolean)[] = ['1', '2', true]
      console.log(arr2)
      // 定義一個(gè)任意類型的數(shù)組
      let arr3 = [1, ['1', '2', true], true]
      console.log(arr3)
    
      // 定義個(gè)對(duì)象類型的數(shù)組,對(duì)象中必須有 name 和 age 兩個(gè)屬性
      const objectArray: { name: string; age: number }[] = [
        { name: '一碗周', age: 18 },
      ]
      // 或者通過 type alias 類型別名的方式聲明
      // 通過 type 定義一個(gè)類型別名
      type User = { name: string; age: number }
      const objectArr: User[] = [{ name: '一碗周', age: 18 }]
    })()

    2.2元組

    元組類型允許表示一個(gè)已知元素?cái)?shù)量和類型的數(shù)組,各元素的類型不必相同。

    示例代碼如下所示:

    ;(function () {
      // 定義一個(gè)值分別被 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) // 拋出異常
    })()

    元組的主要作用就是約束數(shù)組中的每一項(xiàng),及其數(shù)組的長(zhǎng)度。

    元組和數(shù)組是可以可以嵌套的,語法結(jié)構(gòu)如下所示:

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

    上面的代碼中,[string, number]表示一個(gè)元組,在后面增加[],就表示這個(gè)一個(gè)存放元組的數(shù)組。

    2.3對(duì)象

    一個(gè)對(duì)象中可以包含以上所有的類型,示例代碼如下所示:

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

    在TS中我們并不需要在每個(gè)地方標(biāo)注類型,因?yàn)轭愋屯茢?可以幫助我們?cè)诓痪帉戭~外代碼的,即可獲得其功能。但是你想讓你的代碼可讀性更好一些,可以寫上每個(gè)的類型。

    3.類型推斷

    在TypeScript中有的時(shí)候并需要明確指定類型,編譯器會(huì)自動(dòng)推斷出合適的類型,比如下面這段代碼:

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

    我們定義myName變量時(shí),并沒有指定其數(shù)據(jù)類型,只是為他賦了一個(gè)字符串的值,但是我們?nèi)绻麑⑦@個(gè)值重新賦值為要給非string類型的值時(shí),編譯器將會(huì)拋出異常。

    這就是TypeScript中最簡(jiǎn)單的類型推斷,根據(jù)右側(cè)的值來推測(cè)變量的數(shù)據(jù)類型。

    3.1類型聯(lián)合中的類型推斷

    什么是類型聯(lián)合請(qǐng)參考:聯(lián)合類型、交叉類型和類型保護(hù)

    若一個(gè)變量可能具有多個(gè)類型的值時(shí),TypeScript 會(huì)將多個(gè)類型合并起來,組成一個(gè)聯(lián)合類型,

    示例代碼如下:

    let arr = [1, '2'] // 定義一個(gè)包含字符串和數(shù)字的一個(gè)數(shù)組
    // 為上面定義的數(shù)組重新賦值
    // arr = [true, false] // 錯(cuò)誤 不能將類型“boolean”分配給類型“string | number”
    
    // 還有如下例子
    let val = arr.length === 0 ? 0 : '數(shù)組長(zhǎng)度不是0'
    // val = false //  錯(cuò)誤 不能將類型“boolean”分配給類型“string | number”

    3.2上下文類型

    在這之前介紹的例子可能都是按照=右邊的值來推斷=左邊的類型。現(xiàn)在要介紹的上下文類型就與之前的類型推斷不同,編譯器會(huì)根據(jù)當(dāng)期變量所處的上下文環(huán)境來推斷出變量的類型。

    示例代碼如下:

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

    在上面的代碼中,我們首先定義了一個(gè)Person的接口,然后用這個(gè)接口定義一個(gè)數(shù)組,遍歷該數(shù)組時(shí)編譯器推斷itemPerson類型,所以編譯器拋出異常。

    如果我們?yōu)楹瘮?shù)表達(dá)式的參數(shù)添加類型注解,上下文類型將會(huì)被忽略到,也就不會(huì)在報(bào)錯(cuò)了。

    示例代碼如下:

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

    4.類型斷言

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

    這樣做得話他在運(yùn)行是不會(huì)影響,只有在編譯的時(shí)候回影響。

    示例代碼如下:

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

    值得注意的是:在TS中使用JSX時(shí),只有第二種語法是被支持的。

    看完上述內(nèi)容,你們掌握怎樣解析TypeScript基礎(chǔ)類型的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI