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

能否创建仅允许写入、禁止读取的write-only对象?

实现仅可写入、禁止读取的对象

TypeScript类型层面限制

要实现仅允许写入属性、读取时报类型错误的对象,可以通过交叉类型定义WriteOnly类型:

type WriteOnly = {
  [key: string]: any;
} & {
  readonly [key: string]: never;
};

// 初始化对象
const analyticsData: WriteOnly = {} as WriteOnly;

// 允许写入
analyticsData.pageViewCount = 100;
analyticsData.userAction = "click_button";

// 读取时报类型错误:类型“never”上不存在属性“pageViewCount”
console.log(analyticsData.pageViewCount);

这个类型的核心逻辑是:

  • 第一个索引签名[key: string]: any允许给任意属性赋值
  • 交叉的readonly [key: string]: never让所有属性的读取类型为never,触发TypeScript类型检查错误

适配你的业务场景

对于用于数据分析的全局对象:

  • 开发阶段:TypeScript类型检查会阻止开发人员读取该对象的属性,明确传递“不可用于内部数据传递”的信号
  • 调试阶段:运行时该对象的实际值仍然可在浏览器控制台或Node.js终端查看,满足调试人员的分析需求

如果需要进一步在开发环境的运行时阻止读取,可以结合Proxy实现,但注意保留调试时的访问入口(比如仅在非调试模式下启用Proxy拦截):

function createWriteOnlyProxy<T>(target: T): T {
  if (process.env.NODE_ENV === "production") {
    return target;
  }
  return new Proxy(target, {
    get(_, prop) {
      throw new Error(`禁止读取属性 ${String(prop)},该对象仅用于写入分析数据`);
    }
  });
}

// 创建全局分析对象
window.analyticsData = createWriteOnlyProxy({});

// 写入正常
window.analyticsData.pageViewCount = 200;

// 开发环境读取时抛出错误,生产环境正常读取
console.log(window.analyticsData.pageViewCount);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 19:34:51