如何配置TypeScript仅暴露Node与浏览器共有的全局变量?
配置TypeScript以仅支持Node.js与浏览器共有的全局变量
要让TypeScript仅识别Node.js和浏览器环境共有的全局变量,可通过以下配置实现:
1. 调整tsconfig.json编译选项
在tsconfig.json中设置compilerOptions,确保只引入两者共有的标准库,同时禁用自动引入环境专属类型:
{ "compilerOptions": { // 指定仅使用ES标准库(包含setTimeout、console、AbortController等公共全局变量) "lib": ["ES2020"], // 禁止自动引入@types/node、@types/web等环境专属类型包 "types": [], // 开启严格类型检查,避免隐式类型问题 "strict": true } }
lib选项:选择对应版本的ES标准库(如ES2020、ESNext),不要包含dom(浏览器专属)或node(Node.js专属),确保TS仅加载Node与浏览器均实现的ES规范全局变量。types设为空数组:阻止TS自动引入已安装的环境专属类型包,避免混入非公共全局变量类型。
2. 自定义类型声明屏蔽专属全局变量
创建类型声明文件(如src/globals.d.ts),将Node.js和浏览器独有的全局变量声明为never类型,使用时TS会直接报错:
declare global { // Node.js专属全局变量,标记为never禁止使用 const Buffer: never; const process: never; const __dirname: never; const __filename: never; // 浏览器专属全局变量,标记为never禁止使用 const window: never; const document: never; const navigator: never; } export {};
3. 验证配置效果
完成配置后,代码会得到预期的类型检查结果:
Buffer.from(/* ... */); // ❌ 错误:类型为never的表达式不可调用 setTimeout(() => { /* ... */ }, 1000); // ✅ 正常:ES标准全局变量 const a = new AbortController(); // ✅ 正常:ES标准全局变量 console.log(/* ... */); // ✅ 正常:ES标准全局变量 const u = new Uint8Array(/* ... */); // ✅ 正常:ES标准全局变量 process.env.NODE_ENV; // ❌ 错误:类型为never的表达式不可访问属性 __dirname; // ❌ 错误:类型为never的变量不可访问 window.navigator; // ❌ 错误:类型为never的表达式不可访问属性
内容的提问来源于stack exchange,提问作者steveluscher
相关产品推荐
相关产品推荐

