
文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载本文基于 typescript-book 仓库中的 TypeScript 新闻条目2026 年 8 月 24 日发布深入讲解 TypeScript 7 原生native检查器中一项关于类型可访问性的修复在由 union 类型和 intersection 类型合成出来的属性上setter写的可访问性从此与 getter读的可访问性分开记录、分开检查。读完本文你能理解这类合成属性为何会绕过protectedsetter 限制、修复前后的具体行为差异以及如何在自己的代码库中验证这一行为。背景TypeScript 7 原生检查器与这次修复的时间线要理解这项修复需要先了解它所处的版本环境。根据本仓库收录的TypeScript 7.0 发布公告TypeScript 7.0 于 2026 年 7 月 8 日作为稳定版本发布是第一个构建在 Go 语言原生 codebase 之上的 TypeScript 版本其编译器和 language service 均迁移到原生代码类型检查逻辑从 TypeScript 6 迁移而来目标是保持既有类型语义的同时获得性能提升。该公告还说明language service 同时迁移到了 Language Server ProtocolLSP编辑器可以复用同一套原生基础设施。而本文讨论的修复正是在 TypeScript 7.0 发布之后合入原生 codebase 的一项检查器checker修正。仓库中的英文原版新闻条目与印尼语版本都指出微软合并了一个修复使得对于由 union 和 intersection 合成出来的属性读访问与写访问的可访问性被分别保留。对应的上游变更是 TypeScript 的 pull request #63932标题为FixgetDeclarationModifierFlagsFromSymbolExfor synthetic properties——也就是说问题出在检查器获取符号声明修饰符标志declaration modifier flags的路径上针对合成属性写访问setter的修饰符信息没有被独立地反映出来。该新闻条目在仓库的新闻索引中按时间线排列位于 TypeScript 7.0 发布2026-07-08与 7.1 的 ambient 模块 import attributes 特性2026-09-01之间恰好印证了7.0 之后合入这一时间窗口。什么是合成属性union 与 intersection 属性的读写语义当 TypeScript 把多个对象类型组合成 union 或 intersection 时组合后类型上的属性并不是某个类中真实存在的成员声明而是检查器按成员名匹配、综合多个来源后合成出来的属性。这正是问题发生的位置。考虑一个典型的类设计getter 是public的任何代码都能读setter 是protected的只有类内部及其子类能写declare class C1 { get foo(): number; protected set foo(value: number); } declare class C2 { get foo(): number; protected set foo(value: number); }这种写法在封装设计中很常见对外暴露只读视图把写入限制在类型体系内部。get和set虽然共享同一个属性名但它们在类型系统里是两条独立的声明各自携带各自的可访问性修饰符。仓库中《Class》一章在Get and Set与Access Modifiers两节中正是分别讲解了get/set访问器的定义语法以及private、protected、public三种修饰符对成员可见性的控制方式——本例正是读公开、写受保护这一模式的直接应用。现在把这两个类组合成 uniondeclare const c: C1 | C2; c.foo; // 合法读访问是 public c.foo 123; // 非法写访问是 protected对于c.foo这样的属性访问检查器会从C1和C2两个来源中合成属性foo的类型。合成的正确语义应当是读两侧 getter 都是public所以通过 union 读取合法写两侧 setter 都是protected所以在类体系外部赋值应当报可访问性错误。union 类型的背景知识可以在仓库《Union Type》一章中找到入门说明而本修复涉及的是更细粒度的部分——合成属性的可访问性元数据如何从各成员来源正确聚合。修复前的问题setter 的可访问性被 getter 吞掉新闻条目对旧行为的描述很明确对于这些合成属性setter 的可访问性可能被忽略因为检查在效果上直接使用了 getter 的可访问性来判断整个属性的可访问性。把这一机制套到上面的例子上就能看清漏洞C1和C2的foogetter 都是public的所以检查器在判断能否访问c.foo时拿到的是 public 级别的访问权限而对赋值语句c.foo 123本应再去检查合成 setter 的可访问性protected但旧逻辑没有做这步区分——于是protected set foo的限制在穿过 union同样适用于 intersection之后被静默放宽非法写入被放行了。这是一个典型的能力泄漏类型组合本应是保持各成员类型已有约束的结果却因为可访问性信息的丢失而意外扩大widen了写权限。修复内容独立记录写可访问性修复后的行为按新闻条目的原文描述是The checker now records write accessibility separately. Readingfooremains valid, while assigning to it correctly reports an accessibility error.即检查器现在将写访问的可访问性单独记录读取foo依然合法而对它赋值会正确地报告可访问性错误。从源码结构看问题定位在getDeclarationModifierFlagsFromSymbolEx这条获取符号声明修饰符标志的路径上PR 标题即FixgetDeclarationModifierFlagsFromSymbolExfor synthetic properties。从这一命名可以推断该方法负责为某个符号提取其声明上的修饰符标志包含public/private/protected等可访问性信息而在合成属性场景下它对 getter 声明与 setter 声明没有做区分导致赋值检查拿到的标志实际上来自 getter 一侧。修复让读与写各自携带来自对应声明getter / setter的标志从而让c.foo 123这类语句能命中 setter 的protected约束并报出可访问性错误。需要注意的边界新闻条目本身没有给出具体报错文案也没有覆盖部分来源 public、部分来源 protected这类混合场景下的最终语义上述结论均以仓库收录的新闻条目与 PR 标题为依据。为什么这个修复重要守住封装边界这条修复的价值在于守住类的封装契约。类作者常常有意地读公开、写受限——例如只读的状态快照、带不变量校验的写入入口、或只允许子类修改的内部状态。新闻条目对此的表述是Classes can intentionally expose public reads while restricting writes. The fix preserves that boundary when TypeScript combines object types into unions or intersections instead of accidentally widening write access.换言之当 TypeScript 把多个对象类型组合成 union 或 intersection 时这个修复保证作者设定的写边界被完整保留而不是被类型组合机制意外地放宽。对于大量使用组合类型事件对象联合、多实现类的集合、A B风格的能力叠加的代码库这类静默的写权限扩大尤其隐蔽它不产生运行时错误只会让本应被静态检查拦住的赋值合法化削弱类型系统在重构时的保护作用。可用性与升级建议关于这项修复的落地情况新闻条目给出了一条明确的注意事项该变更在 TypeScript 7.0 之后被合入原生 TypeScript codebase。原始资料没有指明包含它的稳定 npm 版本因此建议在依赖此行为之前先核对已安装版本的发布说明。由此可以整理出几条实操建议不要假设 TS 7.0 稳定版已包含此修复。合入发生在 7.0 发布之后具体进入哪个 npm 版本需要以官方 release notes 为准用一段最小用例回归验证。把前文的C1 | C2示例放进项目确认c.foo 123在当前版本上是否报可访问性错误即可判断你所使用的版本是否包含修复结合 7.0 的兼容性约束评估升级。TypeScript 7.0 发布公告指出该版本暂不提供稳定的程序化 API依赖 TypeScript 嵌入能力的工具链如 Astro、Vue、MDX、Svelte 及当时的部分 Angular workflow可能仍需 TypeScript 6团队在评估升级到包含本修复的版本前应先确认框架与工具链的支持情况。7.0 候选版公告也提到过类似的兼容包装typescript/typescript6包升级路径上值得关注官方给出的配套方案。延伸阅读仓库内路径本条新闻原文印尼语包含发布日期2026-08-24、行为描述与上游 PR 出处microsoft/TypeScript PR #63932新闻索引印尼语TypeScript 7 系列变更的时间线总览《Class》一章英文书稿Access Modifiers与Get and Set小节理解protected set语义的基础《Union Type》一章英文书稿union 类型的入门定义。赞分享文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载相关推荐Managed Service for Apache Airflow DAG 排障指南基于 gcloud 日志与源码的确定性故障定位实战Managed Service for Apache Airflow DAG 排障指南基于 gcloud 日志与源码的确定性故障定位实战 本指南完整讲解如何在文档教程TypeScript 7 修复联合类型与交叉类型中 setter 可访问性合成属性读写权限分离TypeScript 7 修复联合类型与交叉类型中 setter 可访问性合成属性读写权限分离 导读 TypeScript 7 的原生类型检查器合并了一项修文档教程TypeScript 7 修复联合类型与交叉类型合成属性的 setter 可访问性缺陷原理、修复细节与验证方法TypeScript 7 修复联合类型与交叉类型合成属性的 setter 可访问性缺陷原理、修复细节与验证方法 本指南基于 typescript book h文档教程上一篇CANN 油气行业工程 SIG 详解面向勘探、生产、炼化场景的高性能算子库建设下一篇模型解释质量评估用Xplique内置指标提升解释可信度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考