TypeError是运行时异常,典型场景包括访问null/undefined属性、调用非函数值、对只读对象赋值等;需结合报错信息定位源头,用typeof、Array.isArray等现场验证类型,并通过可选链(?.)、空值合并(??)及参数守卫主动防御。

类型误判引发的运行时异常,最典型的就是 TypeError:比如访问 null 或 undefined 的属性、调用非函数值、对只读对象赋值等。这类错误不发生在代码加载时,而是在执行到某一行才暴露,所以必须靠“提前预判 + 现场验证”结合来排查。
看控制台报错信息,锁定源头行和操作类型
浏览器 Console 中出现的 TypeError 通常自带关键线索:
- 像
Cannot read property 'xxx' of null,说明你正在访问一个null值的属性 —— 重点检查该变量来源(API 返回?DOM 查询?函数返回?) -
xxx is not a function,说明你本以为是函数,实际得到的是字符串、数字或undefined—— 检查函数名拼写、模块是否正确导入、是否被覆盖或未初始化 -
Cannot assign to read only property,大概率用了Object.freeze()或const声明的对象,却尝试修改其属性
在可疑位置加 console.log 或 typeof 验证实际类型
不要只信变量名或注释,运行时它未必是你想的那样:
- 用
console.log('val:', val, 'type:', typeof val)直接打印值和类型,比猜快十倍 - 对对象用
console.log(val === null, val === undefined, val?.constructor?.name)区分null/undefined/空对象 - 遇到数组方法报错(如
map is not a function),先确认它真是数组:Array.isArray(val),而不是类数组或普通对象
用可选链(?.)和空值合并(??)主动防御
很多 TypeError 其实可以提前“软化”,不让它炸开:
立即学习“Java免费学习笔记(深入)”;
- 代替
obj.user.name→ 写成obj?.user?.name,遇到中间任意环节为null/undefined就静默返回undefined - 代替
value || 'default'(会把0、false、''也转成默认值)→ 改用value ?? 'default',只在null或undefined时生效 - 调用可能不存在的方法前,先判断:
typeof obj.fn === 'function' && obj.fn()
在关键函数入口做参数类型守卫
尤其对从外部传入的数据(API 响应、表单输入、URL 参数),别假设它一定合规:
- 简单校验:
if (typeof id !== 'string' || !id.trim()) throw new TypeError('id must be a non-empty string') - 结构校验(轻量):
if (!data || typeof data !== 'object' || !('name' in data)) {...} - 复杂场景可引入
zod或io-ts做运行时 Schema 校验,失败时给出清晰提示而非抛 TypeError


















