zoukankan      html  css  js  c++  java
  • 完整性检查

    当我们想穷举一个类型的所有可能值时,当可能值过多,不免会遗漏过多的东西。
    通常我们穷举一个值的所有可能,我们会采用switch或者if else,当然,这是可行的,下面看一个if else例子

    function test(p:1|2){
        if(p===1){
            return 1
        }else if(p===2){
            return 2
        }
    }
    

    当p的类型为更多的联合类型的时候,我们会写更多的if else
    问题来了,联合类型越长,我们越是容易疏漏某些值,有没有什么方法检测我们是否完整穷举完了呢?
    这就是完整性检查的作用了。

    方法一:never

    function noNumber(x:never){
        throw new Error("no number"+x);
    }
    function test(p:1|2){
        if(p===1){
            return 1
        }else if(p===2){
            return 2
        }else{
            noNumber(p)
        }
    }
    

    never意思是永远不会出现的类型,看上面的例子,p类型为1|2,由于前面检测完毕,则p永远也不会到最后一个else那里。
    当p为1|2|3的时候,ts编译器会检测到运行至最后一个else时,p不为never,p应该为3,也就是number,会出错。
    另外,不仅仅时是if else,ts编译器起也会对switch检测。
    还有,你也可以不return,在if else的括号内做任何事情都是可以的!

    方法二:设置tsconfig.json

    启用 --strictNullChecks,并且指定一个返回值类型

    function test(p:1|2):1|2{
        if(p===1){
            return 1
        }
    }
    

    会报错,因为有可能返回undefined。当然这种方式不推荐,有点繁琐,失去了拓展的可能。

  • 相关阅读:
    IE的有条件注释
    JavaScript 正则表达式判断是否有小数点
    设置<li>前边圆点样式
    CSS3 Gradient
    z-index
    Linux下weblogic启动报错unable to get file lock的问题
    Linux下启动关闭weblogic
    Java 自动装箱与拆箱(Autoboxing and unboxing)
    jquery怎么跳出当前的each循环
    Integer与int的种种比较你知道多少
  • 原文地址:https://www.cnblogs.com/panshaojun/p/14152601.html
Copyright © 2011-2022 走看看