You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:36:03