尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

TypeDoc `@inline` / `@inlineType` / `@preventInline` 标签:控制类型别名与接口的内联展开

发布时间:2026/9/25 5:08:08

资讯中心
01
ARTICLE

TypeDoc `@inline` / `@inlineType` / `@preventInline` 标签:控制类型别名与接口的内联展开

TypeDoc `@inline` / `@inlineType` / `@preventInline` 标签:控制类型别名与接口的内联展开
开发工具文档【免费下载链接】typedocDocumentation generator for TypeScript projects.项目地址https://gitcode.com/gh_mirrors/ty/typedoc点击查看免费下载本文围绕 TypeDoc 的三个文档注释标签inline、inlineType与preventInline展开说明它们如何控制 TypeDoc 在生成文档时把被引用的类型别名/接口展开成字面量类型还是保留为带链接的类型引用。读完本文你将掌握三个标签的适用位置修改器标签 vs 块标签、内联的判定优先级与继承规则以及从源码层面理解 TypeDoc 内联转换的实现链路shouldInline判定、withScope作用域传递、convertTypeInlined展开逻辑与实际限制边界。三个标签的定位与适用场景当文档中某个参数的类型是类型别名type alias或接口时TypeDoc 默认会把该类型渲染为一个指向其定义处的引用reference读者需要跳转才能看到内部结构。如果你希望结构直接摊开在引用处或者恰恰相反想阻止某个被全局内联的类型在特定位置展开就需要这三个标签标签标签种类作用范围作用对象inlineModifier修改器标签加在被引用的类型自身上影响该类型的所有引用处类型别名、接口inlineTypeBlock块标签加在引用方如函数的注释上只影响该声明内的引用任意带注释的声明preventInlineBlock块标签加在引用方的注释上覆盖全局的inline已被inline或inlineType内联的类型在 TypeDoc 的标签注册表中可以确认这一分类inline被列入modifierTags列表而preventInline与inlineType被列入tsdocBlockTags列表见 tsdoc-defaults.ts 与 tsdoc-defaults.ts。这意味着inline无需参数、附着在声明的 modifier 集合上后两者则以标签 类型名的块标签形式出现需要指定要操作的目标类型名不带类型参数。inline让类型在每一处引用点被展开inline标签可以放置在类型别名和接口上。当一个被标注了inline的类型被引用时TypeDoc 会尝试把被引用的类型内联到引用处即像你在源码里直接写开了结构一样。例如/** * inline */ export type HelloProps { /** Name property docs */ name: string; }; /** * Hello component - HelloProps will be inlined here as * if you had written Hello(props: { name: string }) */ export function Hello(props: HelloProps) { return spanHello {props.name}!/span; }在Hello函数的文档中props的类型会直接显示为{ name: string }及其属性注释而不是一个指向HelloProps的链接。使用inline的限制与注意事项并非所有类型都能内联某些情况下带类型参数的类型引用type references with type parameters无法被内联——从源码结构看types.ts 中referenceConverter明确判断如果节点带有typeArguments则忽略inline因为从node.typeName取出的类型无法解析这些实参。非对象字面量/联合/交叉/字面量类型的展开可能是猜测TypeDoc 对非 object literal、union、intersection 或 literal 形状的类型无法保证内联结果准确。如果inline错误地转换了某个类型官方文档建议提交 bug 报告。注意原文档强调如果把这个标签应用到常用类型上可能会显著增大生成的文档体积——因为该类型的注释会在每一个引用处被重复内联。底层实现内联判定的优先级内联决策集中在Context类的shouldInline方法中见 context.tsshouldInline(symbol: ts.Symbol, name: string): boolean { if (this.preventInline.has(name)) return false; if (this.inlineType.has(name)) return true; return this .getComment(symbol, ReflectionKind.Interface) ?.hasModifier(inline) ?? false; }由此可以确认判定优先级为preventInline拒绝 inlineType强制 被引用类型自身的inline修改器。三个集合inlineType、preventInline在Context中声明为会被withScope继承的字段见 context.ts即块标签的作用域会沿转换作用域向下传递。inlineType在单个位置选择性内联inlineType是块标签用于只在某一处内联一个类型引用而不影响该类型的其他引用点。使用时应指定类型名不带类型参数export type HelloProps { name: string; }; /** * Hello component - HelloProps will be inlined here as * if you had written Hello(props: { name: string }) * inlineType HelloProps */ export function Hello(props: HelloProps) { return spanHello {props.name}!/span; }对比inline的差异inline修改的是被引用类型的定义全局生效inlineType修改的是引用它的声明局部生效。这在同一个 props 类型在大多数地方保持链接引用、但某个核心 API 处希望直接展示结构的场景中非常有用。preventInline阻止已被内联的类型再展开preventInline块标签用于指示 TypeDoc不要内联某个已被inline或inlineType内联的类型/** * inline */ export type HelloProps { /** Name property docs */ name: string; }; /** * Hello component - HelloProps will NOT be inlined here * preventInline HelloProps */ export function Hello2(props: HelloProps) { return spanHello {props.name}!/span; }需要注意一个硬性前提TypeDoc 能否恢复为类型引用取决于 TypeScript 编译器本身是否产出了一个命名的类型引用。从源码看types.tsconvertType路径下内联是在拿到具名symbol之后才通过shouldInline分叉的但如果 TypeScript 一开始就没有产出命名引用例如某些被编译器直接展开的别名preventInline无法阻止展开。换言之如果你移除inline后类型仍被内联那preventInline也救不了它——这是 TypeScript 类型系统层面的行为不是 TypeDoc 能控制的。源码实现链路从注释到内联类型节点结合仓库源码完整的内联转换链路如下注释解析阶段块标签preventInline/inlineType作为blockTags存入注释模型inline则作为 modifier 附着在类型声明上。作用域传递Context.withScope()在切换到子声明如函数体、类成员时复制当前的preventInline/inlineType集合并从该 scope 注释的blockTags中追加新的条目见 context.ts。这解释了为什么块标签的作用域是当前声明及其内部而不是全局。引用转换阶段当转换TypeReference节点时types.ts 的convert与convertType两个入口都会调用context.shouldInline(symbol, name)命中则走convertTypeInlined。内联展开convertTypeInlined 按类型形状分别处理——联合类型生成UnionType、交叉类型生成IntersectionType、字面量生成LiteralType、数组生成ArrayType、元组走 tuple 转换器其余情况回退到typeLiteralConverter展开为类型字面量。这也印证了原文档所说对象字面量、联合、交叉、字面量这几类形状最可靠的表述。测试用例佐证仓库内置的行为测试完整覆盖了上述三个标签输入文件为 inlineTag.ts断言位于 behavior.c2.test.tsinline在 TypeNode 上生效type Foo { inlined: true }被标注inline后foo(param: Foo)的参数类型在文档中渲染为{ inlined: true }嵌套场景Recordstring, Foo渲染为Recordstring, { inlined: true }。preventInline覆盖inlinebar2方法标注preventInline Foo后Recordstring, Foo保持引用形式不展开。inlineType选择性内联Bar未标注inline但selectiveInline(bar: Bar)标注inlineType Bar后该处参数类型渲染为{ inlined: false }。带类型参数时inline被忽略测试文件中/** inline */ type ComplexT { real: T; imag: T }与genericInlineT(): ComplexT的组合用于验证泛型引用不会被内联与 types.ts 中有 type arguments 时忽略 inline的实现一致。一个细节测试文件中Class.baz同时标注了preventInline Foo和preventInline Complex说明块标签可以重复使用来排除多个类型。与expand系列标签的区别inline系列操作的是类型引用的展示形态引用 vs 字面量展开而expand系列标签处理的是类型结构的展开层级如expandType展开嵌套的引用。两者正交可以组合使用inline决定这个别名要不要摊开expand决定摊开后内部嵌套的引用展开几层。小结需要所有引用处都展开某个别名/接口 → 在该类型定义上加inline只需要某一处展开 → 在引用方声明上加inlineType 类型名需要取消某处的展开→ 在引用方声明上加preventInline 类型名前提是 TypeScript 本身产出了命名引用内联判定优先级为preventInlineinlineTypeinline块标签作用域随转换作用域继承慎用inline标注高频类型文档体积会随引用次数成倍膨胀。赞分享开发工具文档【免费下载链接】typedocDocumentation generator for TypeScript projects.项目地址https://gitcode.com/gh_mirrors/ty/typedoc点击查看免费下载相关推荐TypeDoc 展开标签深度解析expand、expandType 与 preventExpand 如何控制类型引用的文档展示TypeDoc 展开标签深度解析expand、expandType 与 preventExpand 如何控制类型引用的文档展示 TypeDoc 在渲染文开发工具文档TypeDoc 标签体系详解TypeScript 项目文档注释中的 Block、Modifier 与 Inline 标签TypeDoc 标签体系详解TypeScript 项目文档注释中的 Block、Modifier 与 Inline 标签 TypeDoc 允许开发者在 JSD开发工具文档Omi组件类型定义TypeScript接口与类型别名Omi组件类型定义TypeScript接口与类型别名 在前端开发中组件化是提高代码复用和维护性的重要手段。Omi作为一款现代前端框架提供了丰富的组件类型定前端Web框架UI组件上一篇ebook2audiobook企业版功能详解高级管理与部署特性介绍下一篇终极指南如何用TransmittableThreadLocal和Spring Boot Actuator实现线程上下文监控创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。