TypeScript中如何禁止未显式导入就使用内置函数和全局变量?
该需求可以实现,通过TypeScript编译配置+ESLint规则配合即可完成,配置完成后你给出的示例代码中未显式导入就使用console、process、Array的场景都会触发错误,完全符合预期,具体配置方式如下:
1. 全量全局禁用配置
如果需要禁止所有未显式导入的内置全局变量使用,按照如下步骤配置:
1.1 TypeScript 编译配置
从类型层面禁止默认识别全局内置对象,修改tsconfig.json:
{ "compilerOptions": { "noLib": true, // 禁用默认加载的ES、DOM等全局内置类型声明 "types": [], // 禁止自动导入node_modules/@types下的全局类型声明(比如@types/node默认注入的process、console全局类型) // 其余原有配置保持不变 } }
1.2 ESLint 校验配置
从语法层面检测未声明的全局变量使用,修改.eslintrc.json:
{ "env": { "browser": false, // 禁用浏览器全局变量预设(window、console等) "node": false, // 禁用Node.js全局变量预设(process、global等) "es2022": false // 禁用ES标准内置全局变量预设(Array、Promise等) }, "rules": { // TS项目优先用下面的TS版规则,非TS项目用原生no-undef即可 "@typescript-eslint/no-undef": "error", // "no-undef": "error" }, // 其余原有配置保持不变 }
1.3 内置对象显式导入方案
配置完成后如果需要使用对应内置对象,可自行封装全局导出文件统一管理依赖:
// src/globals.ts export const console = globalThis.console; export const process = globalThis.process; export const Array = globalThis.Array; // 其他需要用到的内置对象都可在这里统一导出
业务代码中直接从该文件导入即可:
import { console, process, Array } from './globals' export function print(): number[] { console.log("Hello") // 不会报错 process.stdout.write("World!") // 不会报错 return new Array<number>() // 不会报错 }
2. 轻量化方案(仅禁用指定全局)
如果不需要禁用所有全局内置对象,仅想禁止特定几个全局的直接使用,可以不用修改TS的noLib配置,仅在ESLint中添加如下规则即可:
{ "rules": { "no-restricted-globals": ["error", "console", "process", "Array"] } }
仅上述配置即可实现指定全局变量未显式导入就使用时抛出错误,其余全局变量可正常使用。
内容的提问来源于stack exchange,提问作者Corno
相关产品推荐
相关产品推荐

