TypeScript报Unsafe member access [key] on an any错误如何解决?
错误含义
- 这个
@typescript-eslint/no-unsafe-member-access是TypeScript ESLint的类型安全校验规则,触发原因是你给object1、object2声明的类型是any,TS对any类型的变量不会做任何类型检查,直接用[key]访问成员属于不安全的操作,规则认为你没有对访问行为做类型合法性校验,所以抛出错误。
修复方案
首先先补全通用的isObject类型守卫定义,用来做类型收窄,后续方案都会用到:
const isObject = (obj: unknown): obj is Record<PropertyKey, unknown> => { return typeof obj === 'object' && obj !== null && !Array.isArray(obj); };
方案1(推荐):修改入参类型为unknown,先做类型校验再访问成员
把入参的any改成unknown,访问key之前先校验两个参数都是对象,从根源避免any类型的不安全访问,同时还修复了原函数传入非对象类型时的逻辑bug:
export const deepEqual = (object1: unknown, object2: unknown): boolean => { // 非对象类型直接做全等比对 if (!isObject(object1) || !isObject(object2)) { return object1 === object2; } const keys1 = Object.keys(object1); const keys2 = Object.keys(object2); if (keys1.length !== keys2.length) { return false; } for (const key of keys1) { // 这里object1、object2已经被收窄为合法对象类型,访问key不会触发报错 const val1 = object1[key]; const val2 = object2[key]; if (!deepEqual(val1, val2)) { return false; } } return true; };
这个方案完全符合类型安全要求,没有绕过ESLint规则,同时覆盖了原始值、数组等各种边界情况的比对。
方案2(临时兼容用):禁用单条规则
如果业务场景下必须保留入参为any类型,可以在报错行的上一行加注释临时绕过当前规则:
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const val1: unknown = object1[key] as unknown; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const val2: unknown = object2[key] as unknown;
该方案属于规则绕过,不推荐优先使用。
内容的提问来源于stack exchange,提问作者Abhisar Tripathi
相关产品推荐
相关产品推荐

