TypeScript使用 never 类型来表示不应该存在的状态
type bbb = string & number
// TS推断出never类型,因为是不可能出现的
function error(msg: string): never {
throw new Error(msg)
}
// 因为必定抛出异常,所以 error 将不会有返回值
function loop(): never {
while (true) {
}
}
// 因为存在死循环,所以loop将不会有返回值
never类型的一个应用场景
比如我们定义一个switch,都要定义一个default兜底逻辑,如果进入这一步,说明就是程序异常了
interface A {
type: "Tom"
}
interface B {
type: "Jerry"
}
type All = A | B
function type(val: All) {
switch (val.type) {
case "Tom":
break;
case "Jerry":
break;
default:
const check: never = val
break;
}
}
比如我新增一个C接口,我们必须手动找到搜有的switch代码并处理,否则将会触发bug
而且这将是一个“隐蔽性”的bug,如果回归面不够广,很难发现此类bug
那TS有没有办法帮助我们在类型检查阶段发现这个问题呢?
interface A {
type: "Tom"
}
interface B {
type: "Jerry"
}
interface C {
type: "bizz"
}
type All = A | B | C
function type(val: All) {
switch (val.type) {
case "Tom":
break;
case "Jerry":
break;
default:
// 因为没有加入条件,所以会触发兜底函数并且会检测出异常
const check: never = val
break;
}
}
由于任何类型都不能赋值给never类型的变量,所以当存在进入default分支的可能性时,TS的类型检查会及时帮助我们发现这个问题
never 和 viod 的差异
// void类型只是没有返回值,但本身不会出错
function Fn01(): void {
console.log(123)
}
// 只会抛出异常没有返回值
function Fn02(): never {
throw new Error("error")
}