TSC报Object possibly null错误:设默认参数加!断言仍报错
问题原因
- 你添加的
!非空断言仅作用于str变量,仅向TSC声明str本身不会为null/undefined,但本次报错的根源是str.match(regex)的返回值可能为null:按照ECMAScript标准,String.prototype.match()方法在没有匹配到任何符合正则规则的内容时,会直接返回null而非空数组,你没有对这部分返回值做非空处理,所以TSC会抛出对应错误。 - TSC不会静态分析正则的实际匹配逻辑,哪怕你的正则理论上可以覆盖所有输入场景,TS也只会按照通用类型定义,将match方法的返回值判定为
RegExpMatchArray | null的联合类型。
解决方案
你可以任选以下任意一种方案修复问题:
- 对match返回值做兜底处理,用空值合并运算符兜底为空数组,适配所有输入场景
const toTitleCase = (str: string = 'test'): string => { const regex = /^[a-z]{0,1}|\s\w/gi; str = str.toLowerCase(); // 匹配不到时兜底为空数组,避免调用forEach时报错 (str.match(regex) ?? []).forEach((char) => { str = str.replace(char, char.toUpperCase()); }); return str; };
- 先判断match返回值是否存在,再执行遍历逻辑
const toTitleCase = (str: string = 'test'): string => { const regex = /^[a-z]{0,1}|\s\w/gi; str = str.toLowerCase(); const matchResult = str.match(regex); if (matchResult) { matchResult.forEach((char) => { str = str.replace(char, char.toUpperCase()); }); } return str; };
- 如果你确定业务场景下不会出现无匹配的情况,也可以直接给match的返回值加非空断言(不推荐,极端场景下存在运行时报错风险)
const toTitleCase = (str: string = 'test'): string => { const regex = /^[a-z]{0,1}|\s\w/gi; str = str.toLowerCase(); // 直接断言match返回值非空 str.match(regex)!.forEach((char) => { str = str.replace(char, char.toUpperCase()); }); return str; };
内容的提问来源于stack exchange,提问作者ankitm
相关产品推荐
相关产品推荐

