
文档教程【免费下载链接】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 新闻文档英文原版位于 website/src/content/docs/typescript-news/2026/typescript-7-fixes-setter-accessibility.md葡语版本位于 website/src/content/docs/pt-br/typescript-news/2026/typescript-7-fixes-setter-accessibility.md讲解 TypeScript 7 原生Go 版编译器对 union联合与 intersection交叉类型合成属性的读写访问权限检查修复。你将理解该缺陷的触发场景、底层修复函数的作用以及如何在日常代码中设计公开读、受保护写的属性而不被类型系统放大写入权限。背景getter/setter 与访问修饰符的独立语义在 TypeScript 中get与set关键字分别定义类属性的读取与写入行为参见本仓库 类与 Get/Set 章节。访问修饰符public、protected、private用于控制类成员属性与方法的可见性与可访问性参见 Access Modifierspublic无限制访问可从任何位置读写protected仅限所在类及其派生类访问private仅限所在类内部访问。一个关键点在于getter 与 setter 可以声明不同的访问修饰符。例如class Account { private _balance: number; constructor(balance: number) { this._balance balance; } public get balance(): number { return this._balance; } protected set balance(value: number) { this._balance value; } }这种公开读、受保护写的模式是刻意设计的封装边界外部代码可以安全地读取余额但只有类自身及其子类能够修改它。TypeScript 的类型检查器需要在读取表达式与赋值表达式两个场景中分别检查对应的访问权限——这正是本次修复的核心对象。缺陷重现union/intersection 合成属性放大写入权限当 TypeScript 将多个对象类型通过|union参见 Union Type或intersection参见 Intersection Types组合时会为组合结果**合成synthesize**对应属性。此前合成属性的权限检查存在一个缺陷检查逻辑实际使用getter 的访问权限来代表整个属性的访问权限导致 setter 自身的访问限制被忽略。新闻文档给出了完整的复现示例以下代码摘自 原文declare class C1 { get foo(): number; protected set foo(value: number); } declare class C2 { get foo(): number; protected set foo(value: number); } declare const c: C1 | C2; c.foo; // 合法读取权限是 public c.foo 123; // 非法写入权限是 protected在这个示例中C1与C2都具有公开 getter 受保护 setter的foo属性。当它们组合成联合类型C1 | C2时c.foo的读取是合法的因为 getter 是publicc.foo 123的写入应当是非法的因为 setter 是protected。修复之前由于检查器沿用了 getter 的权限来判定属性整体c.foo 123会被错误地视为合法写入相当于通过 union/intersection 间接放大了写入权限——一个本来只能由类内部完成的写入在外部通过组合类型就能执行。修复原理getDeclarationModifierFlagsFromSymbolEx微软合入的修复针对 TypeScript 原生编译器内部函数getDeclarationModifierFlagsFromSymbolEx使其对**合成属性synthetic properties**单独记录写访问权限。合并后的 pull request 标题即为FixgetDeclarationModifierFlagsFromSymbolExfor synthetic properties。从源码结构可以推断该函数负责聚合符号symbol对应声明上的修饰符标志位modifier flags。此前的缺陷在于当属性是从 union/intersection 合成而来时权限标志位聚合过程没有把 getter 与 setter 的修饰符区分保存而是合并到了同一组标志中最终读取侧与写入侧共用同一权限结论。修复后读取权限依据 getter 声明判定写入权限依据 setter 声明判定两者在合成的 union/intersection 属性上保持独立。因此示例中的行为变为c.foo读取依旧合法而c.foo 123会正确报告类型错误TS2440属性foo受保护仅可在类C1及其子类中访问此处属于权限层面的错误报告。为什么重要封装边界的完整性这一修复的意义不在于新增语法而在于保证既有类型系统的权限语义在组合类型下不被破坏设计意图得到保障公开读、受保护写是库作者刻意暴露的契约。修复确保当第三方使用者通过 union/intersection 组合这些类时该契约依然成立。安全边界不被绕过此前的不一致意味着类型检查器对同一属性的读/写给出了自相矛盾的结论削弱了protected作为封装边界的可信度。与 structual typing 体系一致TypeScript 的组合类型检查依赖结构成员而读写权限是成员元数据的一部分修复使合成成员的元数据与显式声明的成员保持一致。结合本仓库的 类章节 可以进一步理解TypeScript 的类本质上是面向对象语法糖最终编译为基于原型的 JavaScript访问修饰符private/protected/public仅在编译期生效。这也意味着本次修复属于纯类型检查层面的行为修正不会影响运行时行为——它让编译期检查与开发者声明的权限意图重新对齐。验证方式在本地复现检查行为在升级到包含该修复的 TypeScript 版本后可以按以下步骤验证将上文示例保存为setter-access.ts运行类型检查例如npx tsc --noEmit setter-access.ts或使用npx tsc --strict修复前c.foo 123不报错或仅报无关错误写入被错误放行修复后赋值语句报告受保护成员访问错误而c.foo读取行保持无错误。也可以将C1 | C2替换为C1 C2intersection 场景观察同样的修复效果intersection 的合成属性同样受益于读写权限分离。可用性与升级建议新闻文档明确说明该修改在 TypeScript 7.0 之后合入原生nativeTypeScript 代码库且来源未指明包含它的稳定 npm 版本。TypeScript 7.0 本身是首个基于 Go 原生代码库的稳定版本参见 TypeScript 7.0 发布新闻安装方式为npm install --save-dev typescript因此在使用该行为前请务必查阅你所安装版本的发布说明release notes确认是否已包含本次修复不能默认任何typescript7版本都具备该行为。同时注意TypeScript 7.0 尚未提供稳定的编程式 API嵌入 TypeScript 的工具链如 Astro、Vue、MDX、Svelte 及部分 Angular 工作流可能仍需要 TypeScript 6——在升级并依赖本修复前应先确认项目工具链的兼容性。延伸阅读TypeScript 7 刷新 tsconfig/jsconfig 配置诊断同属 TypeScript 7 原生编译器/语言服务的检查行为修复展示了原生语言服务如何从文件监听事件驱动诊断更新。ClassAccess Modifiers 与 Get/Set本仓库对类、访问修饰符、getter/setter 的完整讲解是理解本修复语义的基础章节。Union Type 与 Intersection Types组合类型的定义与语法帮助理解合成属性的产生机制。赞分享文档教程【免费下载链接】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 7 修复 union/intersection 合成属性的 setter 可访问性检查读写权限分离解析TypeScript 7 修复 union/intersection 合成属性的 setter 可访问性检查读写权限分离解析 本文基于 typescript文档教程TypeScript 7 修复合成属性的 Setter 访问性Union 与 Intersection 中的读写权限边界TypeScript 7 修复合成属性的 Setter 访问性Union 与 Intersection 中的读写权限边界 导读 TypeScript 7 的文档教程TypeScript 7 修复 Union/Intersection 类型合成属性的 Setter 可访问性TypeScript 7 修复 Union/Intersection 类型合成属性的 Setter 可访问性 2026 年 8 月 24 日微软在 TypeS文档教程上一篇Weave Router子代理路由详解A2_S4_SA1_S1嵌套步骤如何独立做决策下一篇CANN ops-math 切片算子创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考