TS进阶(四)类型保护

2021-01-06  本文已影响0人  Viewwei

类型保护是为了更加精确的知道类型

typeof保护

可以使用typeof用来确定类型,那么参数就可以使用确定类型的方法

  function a(a:number | string | boolean):number{
        if (typeof a == "string"){
            //a.length
            //可以使用字符的方法
        }else if (typeof a == "number"){
        // 可以使用number的方法
        }else{
            //可以使用布尔值
        }
        return 1
    }
}

instanceof 方法

可以使用instanceof用来确定类型,那么参数就可以使用确定类型的方法

 class  A {
        name:string = "1"
    }
    class  C {
        name1:string ="222"
    }
    function AM(param:A |C) {
        if(param instanceof A){
            // param.name
            //可以使用A的属性和方法
        }
    }

null 保护

null保护,就是保护部位null。注意嵌套方法嵌套
function nullCheck(a:string | null){
if (a == null){
return ""
}
return a
}

小知识

使用!表示非空断言,a?.b表示a有值,返回a.b的值,没有返回undefined的

字面量保护

可以使用=== == !== !=来区分字面量的类型

type charat  = '1' | '2'|'3'
    function chara(x:charat) {
        //参数X在函数内部也受类型限制
        if (x =='1'){

        }else if (x=="3")
    }

in 保护

in操作符号可以安全的检查一个对象上是否存在一个属性

 interface A2 {
        A:number
    }
    interface A3{
        B:number
    }
    
    // 这里切记,不能使用typeof instanceof 来判断类型,因为接口(interface)
//    在编译阶段为删除掉
    function test(a:A2|A3){
        if ("A" in a){
            //确定类型为A
        }
    }

自定义类型保护

可以在函数外部定义提个函数用来判断参数的接口类型

    interface C {
        name:string,
        leg:number
    }
    interface C2 {
        name2:string,
        leg:number
    }

    function isC (arg :C|C2): arg is C{
        return (arg as C) .name !== undefined
    }
    function test2(a:C|C2){
        if (isC(a)){
            // 确定为C
        }
    }
上一篇下一篇

猜你喜欢

热点阅读