一、了解never类型
ts的文档
在TypeScript中never就是Bottom Type,意味着一个不表示任何类型的类型,never不会是任何值,可能会被推断出来,或者自己定义避免出现逻辑上的异常
比如一个函数中是一个死循环或异常,这个函数则不会返回任何东西,那么写返回类型的话,写void或者其他的都不合适,那我们就可以使用never
二、基本类型never使用
never单独使用的场景比较少,一般在封装工具时用的多。当在封装工具时,逻辑没有处理完,never就会报错。相当于是一种逻辑判断,当处理完成后则不会报错,更严谨逻辑判断
2.1 一个简单的例子
复制代码
1
2
3
4
5
6function showMessage(info:string | number){ console.log(info) } showMessage("字符串") showMessage(123);
代码看起来没什么问题,假设某天这个函数又多了个对象参数
复制代码
1
2showMessage(info:string | number | object)
很常见的场景就是我们希望,将所有的参数类型都能匹配到,对每个联合类型进行特殊处理。在上面代码中,如果忘记处理了object类型情况,Ts也不会报错。
那么,要怎么在漏处理类型的时候抛出错误呢?我们能在每一个 default 的 语法块中将变量的类型收窄到对应的值。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13function showMessage(info:string | number | object){ switch(typeof info){ case "string": console.log(info) break; case "number": console.log(info) break; default: //.... } }
在最后的 default 语句块中,如果我们还使用这个变量,那么它就会被智能推导为 boolean 类型。这肯定不是我们想看到的,它都走到兜底语句块了还有未收窄过的类型。所以我们简单粗暴的把它赋值为 never
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14function 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' } }
报错了,不能将obj赋值给never,我们再加个处理Object的case
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17function 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; //.... } }
现在就没问题了,因为在穷举完所有类型分支后,info的类型当然就也是 never 啦。这样做只是从 TypeScript 类型层面避免了遗漏,为了安全起见,我们可以在 default 兜底语句中抛出一个错误:
复制代码
1
2
3const Check:never = info; throw new Error(`Unknown input type: ${Check}`);
最后
以上就是鲤鱼火龙果最近收集整理的关于TypeScript中的never应用场景的全部内容,更多相关TypeScript中内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复