如何在 Javascript/TypeScript 中实现C++里对象宏(常量宏)/全局常量的效果

如何在 Javascript/TypeScript 中实现C++里对象宏(常量宏)/全局常量的效果

本文介绍一种在 TypeScript 项目中实现C++里对象宏(常量宏)效果的实用方法,兼顾类型提示、开发体验和产物优化。

步骤一:在 global.d.ts 中声明全局常量

首先,在 global.d.ts 文件中声明一个 const 类型的全局变量。例如:

typescript 复制代码
declare const __IS_DEV__: boolean;

注意:由于 const 语义不可修改,理论上你无法在代码中为它赋值或实现它。但实际上可以通过后续步骤解决。


步骤二:运行时安全赋值

  1. 编写一个macro.ts文件
typescript 复制代码
if (typeof __IS_DEV__ === 'undefined') {
  Reflect.set(globalThis, '__IS_DEV__', true);
}
  1. 在入口文件(如 main.ts)最顶部,添加如下代码:
typescript 复制代码
import '<path>/macro.ts';

细节说明

  1. 安全判断

    除了 typeof __IS_DEV__ === 'undefined' 这种写法,其它所有涉及 __IS_DEV__ 的用法都会被视为"使用",在严格模式下会导致运行时错误。

    • 例如,不能写 if (__IS_DEV__),必须写 if (typeof __IS_DEV__ === 'undefined')。
  2. 开发与生产环境兼容

    • 在测试或开发环境下,__IS_DEV__ 会被设置为 true。
    • 打包时,用 rollup 的 replace 插件将 __IS_DEV__ 替换为 false,配合terser插件净化掉所有相关内容
      • 意味着 if (__IS_DEV__) 将变成 if (false),因其永假性而被terser插件优化掉
      • 同样的,定义处会变成if (typeof false === 'undefined'),因永假性而被terser消除
  3. 类型提示与全局可用性

    • declare 的作用是让全局都能用到 __IS_DEV__ 并获得类型提示,编写时不会报错。
    • 只需在入口文件最上方加上上述定义,运行时即可安全使用。

步骤三:rollup replace 插件配置

在 rollup.config.mjs 中配置 replace 插件(名为@rollup/plugin-replace):

js 复制代码
replace({
  preventAssignment: true,
  ... // 其他配置
  __IS_DEV__: 'false', // 生产环境下替换为 false
}),

总结

  • 通过类型声明、运行时安全赋值和构建时替换,实现了C++里对象宏(常量宏)效果。
  • 开发/测试环境下变量可用,生产环境下相关代码自动优化消除。
  • 兼顾类型安全、运行安全和产物精简。
相关推荐
刘发财10 小时前
前端如何生成10000页PDF文件?
前端·javascript·开源
A接拉起00710 小时前
2026 年 JavaScript 开发者需要了解的知识
前端·javascript·后端
_馒头10 小时前
pixiJs游戏开发实践 - 跳棋小游戏
javascript·vue.js
三*一11 小时前
优化修整算法
前端·javascript·算法
楠楠子呀12 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
半个落月12 小时前
LangGraph.js 实战:从状态图到分支、循环、检查点与人工中断
javascript·人工智能·langchain
默_笙15 小时前
🧀 让大模型的答案"流"出来:NestJS AI 模块 + SSE + RxJS 实战
javascript·人工智能
mbshqqb15 小时前
TypeScript基础教程之同步生成器
前端·javascript·typescript
尤水就下16 小时前
🔥预热:在线文档的 block 架构是如何实现的(未完待续...)
前端·javascript·架构
全栈项目管理程序猿16 小时前
ArcGIS JS 基础教程(29):CSVLayer 表格点位图层
前端·javascript