• TypeScript中的never应用场景


    一、了解never类型

    ts的文档

    TypeScript中never就是Bottom Type,意味着一个不表示任何类型的类型,never不会是任何值,可能会被推断出来,或者自己定义避免出现逻辑上的异常

    比如一个函数中是一个死循环或异常,这个函数则不会返回任何东西,那么写返回类型的话,写void或者其他的都不合适,那我们就可以使用never

    二、基本类型never使用

    never单独使用的场景比较少,一般在封装工具时用的多。当在封装工具时,逻辑没有处理完,never就会报错。相当于是一种逻辑判断,当处理完成后则不会报错,更严谨逻辑判断

    2.1 一个简单的例子

    function showMessage(info:string | number){
        console.log(info)
    }
    showMessage("字符串")
    showMessage(123);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码看起来没什么问题,假设某天这个函数又多了个对象参数

    showMessage(info:string | number | object)
    
    • 1

    很常见的场景就是我们希望,将所有的参数类型都能匹配到,对每个联合类型进行特殊处理。在上面代码中,如果忘记处理了object类型情况,Ts也不会报错。

    那么,要怎么在漏处理类型的时候抛出错误呢?我们能在每一个 default 的 语法块中将变量的类型收窄到对应的值。

    function showMessage(info:string | number | object){
        switch(typeof info){
            case "string":
                console.log(info)
                break;
            case "number":
                console.log(info)
                break;
            default:
                //....
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在最后的 default 语句块中,如果我们还使用这个变量,那么它就会被智能推导为 boolean 类型。这肯定不是我们想看到的,它都走到兜底语句块了还有未收窄过的类型。所以我们简单粗暴的把它赋值为 never

    function showMessage(info:string | number | object){
        switch(typeof info){
            case "string":
                console.log(info)
                break;
            case "number":
                console.log(info)
                break;
            default:
                const Check:never = info;
                //Type 'object' is not assignable to type 'never'
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    报错了,不能将obj赋值给never,我们再加个处理Object的case

    function showMessage(info:string | number | object){
        switch(typeof info){
            case "string":
                console.log(info)
                break;
            case "number":
                console.log(info)
                break;
            case "object":
                console.log(info);
                break;
            default:
                const Check:never = info;
                //....
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    现在就没问题了,因为在穷举完所有类型分支后,info的类型当然就也是 never 啦。这样做只是从 TypeScript 类型层面避免了遗漏,为了安全起见,我们可以在 default 兜底语句中抛出一个错误:

    const Check:never = info;
    throw new Error(`Unknown input type: ${Check}`);
    
    • 1
    • 2
  • 相关阅读:
    网络信息通信的安全问题以及解决方法
    shell_46.Linux使用 getopts 命令
    【深拷贝和浅拷贝】
    【Python入门级】#基础篇#文章目录概览汇总
    【第56篇】GhostNet:廉价操作得到更多的特征
    香港闯关相关法律
    .NET下 支持大小写不敏感的JSON Schema验证方法
    使用python脚本的时间盲注完整步骤
    【计算机网络】UDP/TCP协议
    如何挂载镜像文件(两种方法) 以及利用镜像文件配置本地yum源
  • 原文地址:https://blog.csdn.net/qq_42107364/article/details/128151005