为什么TypeScript中字符串与undefined拼接不会触发错误?
为什么TypeScript严格模式下不对字符串可选参数拼接报错?
核心原因在于TypeScript对两种+操作的风险判定不同:
数值相加的情况
当数值类型的可选参数b留空时,b的值是undefined,执行a + b相当于5 + undefined,结果是NaN——这是一个无效的数值,后续用这个值做计算很容易引发逻辑错误。TypeScript在严格模式下会主动拦截这种可能产生非预期无效值的操作,所以抛出了'b' is possibly 'undefined'的错误。
对应的报错代码:
function fn1(a: number, b?: number) { console.log(a + b); // error 'b' is possibly 'undefined'.(18048) } fn1(5);
字符串拼接的情况
而字符串类型的可选参数留空时,b为undefined,执行a + b相当于'Hi' + undefined。按照JavaScript的规则,undefined会被自动转换为字符串"undefined",最终得到"Hiundefined"——这是一个完全有效的字符串,不会产生运行时异常,属于JavaScript中预期的类型转换行为。TypeScript认为这种操作没有风险,因此在严格模式下不会报错。
对应的合法代码:
function fn2(a: string, b?: string) { console.log(a + b); // valid code } fn2('Hi');
简单来说,TypeScript的严格模式重点拦截会产生无效值或运行时错误的操作,而字符串拼接undefined属于可预测的合法行为,所以不会触发错误。
内容的提问来源于stack exchange,提问作者iobloxx
相关产品推荐
相关产品推荐

