溫馨提示×

溫馨提示×

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

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

TypeScript聯(lián)合類型,交叉類型和類型保護(hù)怎么理解

發(fā)布時間:2021-12-10 10:46:55 來源:億速云 閱讀:172 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“TypeScript聯(lián)合類型,交叉類型和類型保護(hù)怎么理解”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1.聯(lián)合類型

所謂的聯(lián)合類型就是定義一些類型,定義的變量只需要滿足任意一種類型即可,聯(lián)合類型使用|定義,示例代碼如下:

// 通過 | 符號定義聯(lián)合類型
let value: number | boolean | string = '一碗周'
value = 18

在上面的代碼中我們定義了一個value變量,該變量可以是number、boolean或者string類型。

2.交叉類型

介紹了聯(lián)合類型,然后介紹一下與之特別相似的交叉類型。

所謂的交叉類型就是需要滿足所有類型,交叉類型使用&符號定義。

示例代碼如下:

// 定義三個普通接口類型
interface Name {
  name: string
}
interface Age {
  age: number
}
interface Hobby {
  hobby: string
}
// 定義一個對象,該對象為上面三個對象的聯(lián)合類型
let person: Name & Age & Hobby = {
  // 如果少分配一個類型將會拋出異常
  name: '一碗周',
  age: 18,
  hobby: 'coding',
}

3.類型保護(hù)

現(xiàn)在我們有一個需求:獲取一個具有任意類型數(shù)組中第一個數(shù)字。

實現(xiàn)代碼如下:

// 定義一個包含number或者string的數(shù)組
const arr: (number | string)[] = [1, '數(shù)字']
// 遍歷數(shù)組返回第一個數(shù)字
const getValue: (arr: (number | string)[]) => number = (
  arr: (number | string)[],
): number => {
  for (let i = 0; i < arr.length; i++) {
    // 如果當(dāng)前值轉(zhuǎn)換為數(shù)字時候不是一個 NaN 則返回
    if (!isNaN(Number(arr[i]))) {
      return arr[i] // 不能將類型“string | number”分配給類型“number”。
    }
  }
}

上述代碼中return時并不知道返回的是不是一個number類型。所以將會拋出異常。

上述功能可以通過類型斷言來完成,示例代碼如下:

const getValue: (arr: (number | string)[]) => number = (
  arr: (number | string)[],
): number => {
  for (let i = 0; i < arr.length; i++) {
    // 如果當(dāng)前值轉(zhuǎn)換為數(shù)字時候不是一個 NaN 則返回
    if (!isNaN(Number(arr[i]))) {
      return arr[i] as number // 告訴 編譯器 我返回的就是一個 number
    }
  }
}

什么是類型斷言請參考:類型斷言

如果使用類型斷言來說明,如果想要的數(shù)據(jù)類型不一樣時,就會顯得比較繁瑣。這個時候就需要類型保護(hù)來完成該功能,

類型保護(hù)主要分為以下三種:

3.1自定義類型保護(hù)

自定義類型保護(hù)的方式就是定義一個函數(shù),該函數(shù)是的返回結(jié)構(gòu)是一個parameterName is type的形式,該形式是一個類型謂詞 。parameterName必須是來自于當(dāng)前函數(shù)參數(shù)里的一個參數(shù)名。

示例代碼如下:

// 使用自定義類型保護(hù)
// 1. 定義一個函數(shù) 其返回值是一個 類型謂詞,即 parameterName is Type 也就是 參數(shù)名 is 類型 的形式
function isNumber(value: number | string): value is number {
  // 如果返回 true 則說明 傳入的 value 是 is 后面的type
  return !isNaN(Number(value))
}
// 2. 定義一個獲取數(shù)字的函數(shù)
const getNumber: (value: number | string) => number = (
  value: number | string,
): number => {
  // 如果調(diào)用 isNumber 的值為 true 則說明 value 是一個數(shù)字,所以將數(shù)字返回
  if (isNumber(value)) {
    return value
  }
}
// 3. 調(diào)用獲取最終的數(shù)值
const getValue: (arr: (number | string)[]) => number = (
  arr: (number | string)[],
): number => {
  for (let i = 0; i < arr.length; i++) {
    // 如果返回數(shù)字,轉(zhuǎn)換為 boolean 值為 true
    if (getNumber(arr[i]) || getNumber(arr[i]) === 0) {
      return getNumber(arr[i])
    }
  }
}

定義第二個函數(shù)的原因是在數(shù)組中直接使用i作為返回值還是有問題的,所以定義一個函數(shù)過渡一下。

3.2typeof 類型保護(hù)

JavaScript 中的typeof關(guān)鍵字可以判斷當(dāng)前類型,但是僅僅只能判斷numberstring、booleansymbol四種類型。

在這個需求中就足夠了,接下來我們看看如何通過typeof來實現(xiàn)類型保護(hù)。

示例代碼如下:

// 1. 定義一個獲取數(shù)字的函數(shù)
const getNumber: (value: number | string) => number = (
  value: number | string,
): number => {
  // 判斷當(dāng)前是否為字符串,如果是返回當(dāng)前值
  if (typeof value === 'number') {
    return value
  }
}
// 2. 調(diào)用獲取最終的數(shù)值
const getValue: (arr: (number | string)[]) => number = (
  arr: (number | string)[],
): number => {
  for (let i = 0; i < arr.length; i++) {
    // 如果返回數(shù)字,轉(zhuǎn)換為 boolean 值為 true
    if (getNumber(arr[i]) || getNumber(arr[i]) === 0) {
      return getNumber(arr[i])
    }
  }
}

3.3instanceof類型保護(hù)

instanceof操作符也是JavaScript中提供的原生操作符,它用來判斷一個實例是不是某個構(gòu)造函數(shù)創(chuàng)建的,或者是不是使用ES6語法的某個類創(chuàng)建的。在TypeScript中也可以通過instanceof操作符來實現(xiàn)類型保護(hù),

示例代碼如下:

/**
 * 由于 instanceof 僅僅支持引用類型,不支持原始類型,所以說這里需要進(jìn)行一下改動,將數(shù)組修改為如下:
 */
const arr2: (Number | String)[] = [new String('彼岸繁華'), new Number(10)]
// 1. 定義一個獲取數(shù)字的函數(shù)
const getNumber: (value) => number = (value): number => {
  // 判斷當(dāng)前是否為 Number 類型,將當(dāng)前值轉(zhuǎn)換為字符串返回
  if (value instanceof Number) {
    return Number(value)
  }
}
// 2. 調(diào)用獲取最終的數(shù)值
const getValue: (arr: (Number | String)[]) => number = (
  arr: (Number | String)[],
): number => {
  for (let i = 0; i < arr.length; i++) {
    // 如果返回數(shù)字,轉(zhuǎn)換為 boolean 值為 true
    if (getNumber(arr[i]) || getNumber(arr[i]) === 0) {
      return getNumber(arr[i])
    }
  }
}

使用instanceof時需要注意一下兩點:

  • 只適應(yīng)于任何引用類型,不支持原始類型。

  • 前者的原型鏈上是否 包含 后者的原型對象。

“TypeScript聯(lián)合類型,交叉類型和類型保護(hù)怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

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

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

AI