TypeScript12 - never类型

本文介绍了TypeScript中never类型的概念及其应用,通过示例展示了如何使用never类型来表示不应该出现的状态,如函数抛出异常或无限循环。在switch语句中使用never作为默认情况的类型可以辅助捕获未处理的枚举值,从而在类型检查阶段发现潜在的程序错误。同时,对比了never与void类型的差异,强调never类型在防止错误方面的作用。
摘要由CSDN通过智能技术生成

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")
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值