想问下 下面俩段代码 中,ts报错 为什么。
const expr = 'Papayas';
switch (expr) {
case 'Oranges':
let a = 123;
console.log('Oranges are $0.59 a pound.',a);
break;
case 'Papayas':
let a = 456;
console.log('Mangoes and papayas are $2.79 a pound.',a);
break;
default:
console.log(`Sorry, we are out of ${expr}.`);
}
const expr = 'Oranges';
switch (expr) {
case 'Oranges':
let a = 123;
console.log('Oranges are $0.59 a pound.',a);
break;
case 'Papayas':
a = 456;
console.log('Mangoes and papayas are $2.79 a pound.',a);
break;
default:
console.log(`Sorry, we are out of ${expr}.`,a);
}
才发现第一种也是有问题的 ,好奇怪
我个人一直以为第一种写法是对的,但是ts报错提示我重复定义了,我就改成第二种写法写的,结果发现 build 以后(webpack) 就变成这样了,导致变量没有定义,为什么会有这样奇怪的行为
chunk代码就成这样了,代码中就会生成一个r 变量,这个变量没有定义就被使用。。。
有点搞不清楚了,大佬快来讲讲。
这两段 TypeScript 代码的报错原因都与 JavaScript/TypeScript 的 块级作用域 和 switch 语句特性 有关。
第一段代码报错原因:
原因:
case
共享同一个作用域,并不是每个case
有独立的作用域。case 'Oranges'
和case 'Papayas'
中分别用let a
声明变量时,相当于在同一个作用域内重复声明同名变量a
。let
声明的变量具有块级作用域,且在同一个作用域内不允许重复声明。第二段代码报错原因:
原因:
a
的声明被限制在case 'Oranges'
的代码块中。虽然switch
的case
共享作用域,但a
的声明只有在case 'Oranges'
执行时才会发生。expr
的值是'Papayas'
,代码会直接跳转到case 'Papayas'
,此时a
尚未声明,直接赋值a = 456
会导致“变量在声明前使用”的报错。default
分支中访问a
时,如果a
未被任何case
声明(例如expr
是其他值),也会导致“变量未定义”的错误。解决方案:
TypeScript 的报错是由于
switch语句的
case共享作用域导致的变量重复声明或作用域不明确。通过统一声明变量或用
{}隔离作用域即可解决。
方法 1:统一声明变量
在
switch
语句外部声明变量,避免重复声明或作用域问题:方法 2:为每个
case
创建独立作用域用
{}
包裹每个case
的代码,强制创建独立块级作用域: