码迷,mamicode.com
首页 > 其他好文 > 详细

完整性检查

时间:2020-12-22 13:12:56      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:efi   何事   返回   row   出错   fine   ber   cti   json   

当我们想穷举一个类型的所有可能值时,当可能值过多,不免会遗漏过多的东西。
通常我们穷举一个值的所有可能,我们会采用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。当然这种方式不推荐,有点繁琐,失去了拓展的可能。

完整性检查

标签:efi   何事   返回   row   出错   fine   ber   cti   json   

原文地址:https://www.cnblogs.com/panshaojun/p/14152601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!