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

如何通过ESLint和TypeScript禁用JSON全局变量并强制使用封装函数

解决方案:强制使用封装的JSON处理函数并禁用原生JSON方法

一、ESLint 层面拦截原生JSON方法

之前设置globals: { JSON: "off" }无效,是因为原生JSON属于环境内置对象,ESLint默认不会主动拦截。可以通过以下规则实现限制:

1. 精准禁用JSON.stringify/JSON.parse

在.eslintrc.js中配置no-restricted-properties规则,直接禁止调用这两个方法:

module.exports = {
  rules: {
    'no-restricted-properties': [
      'error',
      {
        object: 'JSON',
        property: 'stringify',
        message: '请使用项目封装的stringify函数替代原生JSON.stringify'
      },
      {
        object: 'JSON',
        property: 'parse',
        message: '请使用项目封装的parseJSON函数替代原生JSON.parse'
      }
    ]
  }
};

代码中直接调用原生方法时,ESLint会抛出错误并给出明确提示。

2. 全局禁用整个JSON对象(可选)

如果要彻底禁止使用JSON对象,可结合no-restricted-globals规则:

module.exports = {
  rules: {
    'no-restricted-globals': [
      'error',
      {
        name: 'JSON',
        message: '禁止直接使用原生JSON对象,请使用封装后的处理函数'
      }
    ]
  }
};

若封装函数内部需要调用原生JSON,可在封装文件中添加注释忽略规则:

// eslint-disable-next-line no-restricted-globals, no-restricted-properties
export const stringify = (data: unknown) => {
  try {
    return JSON.stringify(data);
  } catch (err) {
    // 自定义错误处理与日志逻辑
    console.error('JSON序列化失败:', err);
    throw new Error('序列化数据出错');
  }
};

二、TypeScript 编译阶段限制

之前声明global.JSON = null无效,因为TS会优先读取内置的JSON类型定义。可以通过类型覆盖+TS ESLint规则实现拦截:

1. 覆盖全局JSON类型

在项目根目录的global.d.ts中重新定义JSON接口,将stringify和parse标记为never类型:

declare global {
  interface JSON {
    stringify: never;
    parse: never;
  }
}

export {};

确保该文件被tsconfig.json的include字段包含:

{
  "include": ["src/**/*", "global.d.ts"]
}

此时开发者调用原生方法时,TS会直接抛出编译错误:“类型为never的属性不可调用”。

2. 配合TS专属ESLint规则

使用@typescript-eslint/no-restricted-properties规则,比原生ESLint规则更适配TS语法:

module.exports = {
  parser: '@typescript-eslint/parser',
  plugins: ['@typescript-eslint'],
  rules: {
    '@typescript-eslint/no-restricted-properties': [
      'error',
      {
        object: 'JSON',
        property: 'stringify',
        message: '请使用项目封装的stringify函数'
      },
      {
        object: 'JSON',
        property: 'parse',
        message: '请使用项目封装的parseJSON函数'
      }
    ]
  }
};

三、落地保障建议

  • 将封装的stringify/parseJSON函数统一放在项目工具库(如src/utils/json.ts),并通过文档明确要求团队使用。
  • 在CI/CD流程中加入ESLint检查和TS编译步骤,拦截违规代码合并到主分支。

内容的提问来源于stack exchange,提问作者Noah May

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:55:24