類型保護

類型保護 能辨識出返回類型

1.typeof
function getVal(val: string | number) {
  if (typeof val === "string") {
    val.padStart
  } else {
    val.toFixed
  }
}
2.instanceof
class Cat { }
class Dog { }

// 構(gòu)造函數(shù)類型表示方法
// const getInstance = (clazz: { new(): Cat | Dog }) => {
// }

// 構(gòu)造函數(shù)類型表示方法
const getInstance = (clazz: new () => Dog | Cat) => {
  return new clazz
}

let instance = getInstance(Dog)
if (instance instanceof Dog) {
  instance // Dog
} else {
  instance // Cat
}

3.in操作符

interface Bird {
  fly: string
}
interface Fish {
  swimming: string
}

function getType(animal: Bird | Fish) {
  if ("swimming" in animal) {
    animal // fish
  } else {
    animal // bird
  }
}
4.ts特有 可辨識的類型
interface IButton1 {
  class: "success", // 字面量類型
  click: string
}
interface IButton2 {
  class: "warning",
  mouseover: string
}
function getButton(val: IButton1 | IButton2) {
  if (val.class === "success") { // success 是具體的字符串類型
    val.click
  } else {
    val.mouseover
  }
}
5.is語法 自定義類型
interface Fish {
  swimming: string
}
interface Bird {
  fly: string
}
// xxx is XX ts語法
// animal is Fish 表示為true則肯定是Fish, 如果animal is Fish去掉只是返回boolean則無法判斷調(diào)用方傳入的到底是不是Fish
function isFish(animal: Fish | Bird): animal is Fish {
  return 'swimming' in animal
}
function getsType(val: Fish | Bird) {
  if (isFish(val)) {
    val
  } else {
    val
  }
}
6.null 保護 !非空斷言
function getNumber(val?: number | null) {
  val = val || 10
  if (val != null) {
    val.toFixed
  }
}
getNumber()
7.對代碼完整性進行保護 反推代碼 never
interface ICircle {
  kind: 'circle',
  r: number
}
interface IRant {
  kind: 'rant',
  width: number,
  height: number
}
interface ISquare {
  kind: 'square',
  width: number
}
const assert = (obj: never) => { } // 返回never的函數(shù)必須存在無法達到的終點
const getArea = (obj: ICircle | IRant | ISquare) => {
  switch (obj.kind) {
    case 'rant':
      return obj.width * obj.height
    case 'circle':
      break
    case 'square':
      break
    default:
      // 如果switch沒有遍歷所有類型的case,則會執(zhí)行到default則報錯
      return assert(obj) // 為了實現(xiàn)完整性
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容