类型保护 能辨识出返回类型
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) // 为了实现完整性
}
}