完整性检查

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

上一篇:Python基础之String


下一篇:TypeScript类型系统和基础类型