TypeScript 将使用 never 类型来表示不应该存在的状态
复制代码
1
2
3
4
5
6
7
8
9
10// 返回never的函数必须存在无法达到的终点 // 因为必定抛出异常,所以 error 将不会有返回值 function error(message: string): never { throw new Error(message); } // 因为存在死循环,所以 loop 将不会有返回值 function loop(): never { while (true) { } }
never 与 void
的差异
复制代码
1
2
3
4
5
6
7
8
9//void类型只是没有返回值 但本身不会出错 function Void():void { console.log(); } //没有返回值,并且会抛出异常 function Never():never { throw new Error('aaa') }
never 类型的应用场景
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19interface A { type: "foo" } interface B { type: "bar" } type All = A | B ; function handleValue(val: All) { switch (val.type) { case 'foo': break; case 'bar': break default: //兜底逻辑 一般是不会进入这儿如果进来了就是程序异常了 const exhaustiveCheck:never = val; break } }
此时新来了一个同事他新增了一个C接口,我们必须手动找到所有 switch 代码并处理,否则将有可
能引入 BUG 。
而且这将是一个“隐蔽型”的BUG,如果回归面不够广,很难发现此类BUG。
那 TS 有没有办法帮助我们在类型检查阶段发现这个问题呢?
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22interface A { type: "foo" } interface B { type: "bar" } interface C { type: "bizz" } type All = A | B | C; function handleValue(val: All) { switch (val.type) { case 'foo': break; case 'bar': break default: //兜底逻辑 一般是不会进入这儿如果进来了就是程序异常了 const exhaustiveCheck: never = val; break } }
由于任何类型都不能赋值给 never
类型的变量,所以当存在进入 default
分支的可能性时,TS的
类型检查会及时帮我们发现这个问题
最后
以上就是老实白昼最近收集整理的关于TypeScript13(never类型)never 与 void 的差异never 类型的应用场景的全部内容,更多相关TypeScript13(never类型)never内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复