用途:当一个包的抽象基类型其所有子类型都定义在同一库中,但基类型未标记 sealed 时,本技能指导将其密封,使编译器能强制校验 switch 的穷举性。也可用于评审新类型层级是否应对外部子类型开放。
主要能力:说明密封的价值——密封后添加子类型会在每个 switch 处产生编译错误,而非运行期静默穿透;给出检测条件:抽象且未密封、有两个及以上直接子类型、所有直接子类型与基类型同库、密封不构成破坏性变更(位于 lib/src/ 下、已标记 final,或属于应用而非已发布库)。
使用方式:确认候选后,在基类型声明上加 sealed,运行 dart analyze 查看所有非穷举 switch 与库外子类型的报错,再把 is 级联改写成 switch 表达式,移除仅为满足返回类型而存在的 throw/default,并考虑将叶子子类型标记为 final。
限制(不要密封的情况):子类型跨多个库;该类型是公开 API 且本意允许外部扩展(插件接口、访问者基类、扩展点);基类型是具体类且被直接实例化(sealed 隐含 abstract);子类型少于两个;pubspec.yaml 中 environment.sdk 低于 3.0.0(类修饰符自 Dart 3 起才存在)。检测本身不是单文件正则能表达的,需先收集包内所有类型声明与 extends/implements/with 边,且是否破坏公开 API 需由人确认。资料未提供安装命令与补充示例。