首页/新闻资讯/正文详情

TypeDoc @readonly 标签详解:将可写成员标记为文档只读

发布时间:2026/9/26 7:41:19 来源:云帆数科 栏目:资讯中心
TypeDoc @readonly 标签详解:将可写成员标记为文档只读
开发工具文档【免费下载链接】typedocDocumentation generator for TypeScript projects.项目地址https://gitcode.com/gh_mirrors/ty/typedoc点击查看免费下载导读readonly是 TypeDoc 提供的一组修饰符标签Modifier Tag之一它允许你在 TypeScript 类型系统认为某个成员“可写”的情况下仍指示 TypeDoc 在生成文档时将其呈现为只读non-writable。本文结合 TypeDoc 仓库源码完整讲解readonly的语义、底层处理流程、渲染效果与测试用例帮助你在 API 文档中精确表达“消费方不应修改”的设计意图。readonly标签语义根据 site/tags/readonly.md 的官方说明Thereadonlytag indicates that a reflection should be documented as non-writable, even if writable according to TypeScript.即readonly的作用是覆盖 TypeScript 本身的可写性判断。无论 TypeScript 认为该成员是否有 setter、是否可赋值只要注释中带有readonlyTypeDoc 就会将其记录为只读并如此渲染。该标签属于修饰符标签Modifier Tag与private、protected、public、abstract、sealed等同属一类完整清单见 tags.md。官方示例getter 与 setter 的处理原文档给出的示例展示了一个经典场景——某个属性同时定义了 getter 与 setter但从文档视角应视为只读export class Readable { /** readonly */ get prop() { return 1; } /** Will be removed from the documentation due to the readonly tag */ set prop(_: number) { throw new Error(Not permitted); } }在这个例子中getterprop上的readonly使整个属性在文档中被标记为只读setterprop的注释也说明它会因 readonly 标签而从文档中移除。源码级解析readonly的完整处理链路1. 修饰符识别与标志设置readonly的解析发生在转换器插件 CommentPlugin.ts 的applyModifiers中。当注释包含readonly修饰符时第 234–240 行if (comment.hasModifier(readonly)) { const target reflection.kindOf(ReflectionKind.GetSignature) ? reflection.parent! : reflection; target.setFlag(ReflectionFlag.Readonly); comment.removeModifier(readonly); }关键逻辑在于如果反射对象是GetSignaturegetter 签名则把Readonly标志设置到它的父级即属性/访问器本身否则直接设置到当前反射对象处理完成后会从注释中移除readonly修饰符确保它不会以原始标签形式出现在渲染结果中。ReflectionFlag.Readonly定义在 Reflection.ts 中是一个位标志export enum ReflectionFlag { None 0, // ... Readonly 1 9, // ... }同时它被列入relevantFlags第 45–53 行并对外暴露isReadonlygetter第 124–125 行供渲染模板查询get isReadonly() { return this.hasFlag(ReflectionFlag.Readonly); }2. 解决阶段隐藏 setter 并清理标志在onBeginResolve第 361–368 行中TypeDoc 会遍历项目中的反射对**访问器Accessor**做特殊处理if (ref.kindOf(ReflectionKind.Accessor) ref.flags.isReadonly) { const decl ref as DeclarationReflection; if (decl.setSignature) { hidden.add(decl.setSignature); } // Clear flag set by readonly since it shouldnt be rendered. ref.setFlag(ReflectionFlag.Readonly, false); }这段代码揭示了两点实现细节setter 被加入隐藏集合凡是被readonly标记的访问器其setSignature会被隐藏最终通过project.removeReflection从文档中移除——这正是原文档示例中 setter “被移除”的底层原因清除访问器本身的 Readonly 标志注释明确指出该标志“不应被渲染”shouldnt be rendered因为只读性最终体现在签名渲染的关键字上而不是访问器本身上。3. 渲染阶段readonly关键字的输出只读标志最终会以 TypeScript 的readonly关键字形式出现在生成的文档签名中。在默认主题的索引签名渲染中可以看到templates/reflection.tsx第 79–84 行{index.flags.isReadonly ( span classtsd-signature-keywordreadonly/span { } / )}partials/typeDetails.tsx第 388–393 行中也有完全相同的渲染逻辑用于参数索引签名。也就是说isReadonly标志一旦置位文档签名前就会出现readonly关键字让读者一眼看出该成员不可写。测试用例验证仓库在 readonlyTag.ts 中提供了覆盖readonly行为的测试样例包含两种典型用法export class Book { /** * Technically property has a setter, but for documentation purposes it should * be presented as readonly. * readonly */ get title(): string { return hah; } set title(_value: string) { throw new Error(This property is read-only!); } /** * Should be documented as readonly because no consumer should change it. * readonly */ author!: string; }该测试用例与原文档示例相互印证覆盖了两个典型场景含 setter 的属性title在类型层面可写存在 setter但通过readonly声明为文档只读类属性字段author使用!断言definite assignment assertion本身是可赋值的同样通过readonly在文档中呈现为只读。使用建议与注意事项适用场景API 设计中的“防御性只读”属性虽然出于实现原因保留了 setter但设计上禁止外部修改如内部状态、缓存值。此时用readonly向文档读者明确传达契约避免误导的类型系统表达当 TypeScript 的类型信息无法表达“不可变”语义例如定义了 setter 但会抛错、或使用!断言声明的字段readonly是补充文档语义的正确工具索引签名对于索引签名index signatureReadonly 标志同样会被渲染为readonly关键字可配合使用。注意事项readonly只影响 TypeDoc 的文档输出不会改变 TypeScript 的类型检查行为不要用它替代readonly修饰符或ReadonlyT类型工具标记了readonly的访问器的setter 会从文档中完全移除这是预期行为而非 bug见 CommentPlugin.ts 的隐藏逻辑与private、sealed等一样它属于修饰符标签会在转换阶段被消费并从注释中移除不会残留在渲染文本中。小结readonly是 TypeDoc 修饰符标签家族中一个简洁但实用的工具通过一行注释即可覆盖 TypeScript 的可写性判断将成员在文档中呈现为只读并自动隐藏对应的 setter。其完整链路——从 CommentPlugin.ts 的标志设置、解决阶段的 setter 隐藏到默认主题模板中的readonly关键字渲染——都体现了 TypeDoc “以注释驱动、以类型为基础”的文档生成理念。当你的 API 存在“类型可写但契约只读”的成员时readonly就是表达该契约的标准方式。赞分享开发工具文档【免费下载链接】typedocDocumentation generator for TypeScript projects.项目地址https://gitcode.com/gh_mirrors/ty/typedoc点击查看免费下载相关推荐TypeDoc abstract 标签在 TypeScript 中把“非抽象”方法标记为抽象并写入文档TypeDoc abstract 标签在 TypeScript 中把“非抽象”方法标记为抽象并写入文档 本篇基于 TypeDoc 官方文档中 abstra开发工具文档TypeDoc internal 标签详解标记内部 API 并通过 --excludeInternal 从文档中移除TypeDoc internal 标签详解标记内部 API 并通过 excludeInternal 从文档中移除 本文围绕 TypeDoc 的 inter开发工具文档TypeDoc deprecated 标签详解从文档标记到删除线渲染的完整机制TypeDoc deprecated 标签详解从文档标记到删除线渲染的完整机制 本文基于 TypeDoc 官方文档 site/tags/deprecated开发工具文档上一篇munder-difflin 时间窗口技能解析last30Days 如何把近 30 天解析为精确的 ISO 日期范围下一篇终极指南ViewAnimator从iOS 8到iOS 15的跨版本适配要点创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

晋级答辩复盘,别再让录音躺死在手机里
晋级答辩复盘,别再让录音躺死在手机里

又是一年职级晋升季。我自己做过十年技术团队管理,也参与过几十场内部答辩评审,每次答辩结束,最让我感慨的不是候选人的技术水平,而是复盘这个环节——几乎所有人都做得不够好。答辩现场慷慨激昂,评委提问犀利深入&… · 2026/9/26 7:41:13

AI代理数据泄露:责任归因与检测治理实战
AI代理数据泄露:责任归因与检测治理实战

1. 当"作案者"不是人:这起报告为什么让安全圈集体沉默西班牙这起数据泄露报告之所以值得单独拿出来聊,不是因为它造成了多大的实际损失,而是因为它第一次把一个此前只存在于理论推演里的问题,硬生生摆到了监管和取证桌面… · 2026/9/26 7:41:13

AI Agent开发全指南:从工具调用到记忆评估与安全防线
AI Agent开发全指南:从工具调用到记忆评估与安全防线

说出来你可能不信,9月18日晚上我还在和朋友讨论AI搜索能不能替代浏览器,19日一早起来,朋友圈已经被Agent刷屏了。一翻社区,满屏都是Agent框架、Agent记忆、Agent评估,甚至还有人开始给Agent开发专用调试工具。这个圈子… · 2026/9/26 7:41:13

Synology HDD db 教程:3步把第三方硬盘加入群晖兼容数据库
Synology HDD db 教程:3步把第三方硬盘加入群晖兼容数据库

Synology HDD db 教程:3步把第三方硬盘加入群晖兼容数据库 【免费下载链接】Synology_HDD_db Add your HDD, SSD and NVMe drives to your Synologys compatible drive database and a lot more 项目地址: https://gitcode.com/GitHub_Trending/sy/Synology_HDD_d… · 2026/9/26 8:19:41

Atlas 300V 24G部署YOLO全流程:从选型到踩坑实录
Atlas 300V 24G部署YOLO全流程:从选型到踩坑实录

最近在社区里看到两类高频问题,一类是“atlas部署yolo”具体要怎么操作,另一类更基础,直接问“atlas 300v 24g 是运算加速卡吗”。说实话,第一批拿到Atlas 300V 24G的开发者,很多人第一反应都是懵的:它长得… · 2026/9/26 8:19:35

OpenTTD 货运分配链路图(Link Graph)机制与性能调优指南
OpenTTD 货运分配链路图(Link Graph)机制与性能调优指南

游戏开发 【免费下载链接】OpenTTD OpenTTD is an open source simulation game based upon Transport Tycoon Deluxe 项目地址: https://gitcode.com/gh_mirrors/op/OpenTTD 点击查看 免费下载 本文以 docs/linkgraph.md 为主线,结合 OpenTTD 源码中 s… · 2026/9/26 8:19:35

OpenClaw+The Agency构建企微AI员工系统实战
OpenClaw+The Agency构建企微AI员工系统实战

1. 项目概述:当企微变成AI员工调度中心 我在企业微信里养了130个AI员工——这不是夸张修辞,而是过去三个月真实跑起来的生产环境。它们不领工资、不请假、不摸鱼,724小时响应客户咨询、自动归档会议纪要、同步更新销售线索、生成日报周报、甚… · 2026/9/26 8:19:23

MySQLTuner-perl v2.8.12:容器运行时检测增强(containerd/podman 识别)深度解析
MySQLTuner-perl v2.8.12:容器运行时检测增强(containerd/podman 识别)深度解析

数据库运维 【免费下载链接】MySQLTuner-perl MySQLTuner is a script written in Perl that will assist you with your MySQL configuration and make recommendations for increased performance and stability. 项目地址: https://gitcode.com/gh_mirrors/my/My… · 2026/9/26 8:19:10

树莓派低延迟摄像头图传:Socket+picamera实现实时视频传输
树莓派低延迟摄像头图传:Socket+picamera实现实时视频传输

1. 项目缘起与整体设计思路1.1 为什么会有这个需求手里攒了几块树莓派,从早期的3B到后来的4B、5都有,摄像头模块也买了好几个,OV5647、IMX219、IMX477这些都用过。最开始的想法很简单,就是想让树莓派上采集到的画面能实时传到PC上… · 2026/9/26 8:19:10

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码