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