类型保护

类型保护 能辨识出返回类型

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

// 构造函数类型表示方法
// const getInstance = (clazz: { new(): Cat | Dog }) => {
// }

// 构造函数类型表示方法
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则无法判断调用方传入的到底是不是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的函数必须存在无法达到的终点
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,则会执行到default则报错
      return assert(obj) // 为了实现完整性
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容