ITADN

refactor(manageSkills): State レコードと公開インタフェースの Ref フィールド二重列挙(alerts #436/#437)— children 抽出シリーズ完了後に

#2481Closedisamu 创建于 26 天前
I
isamucommented
## 何が重複しているか(Code Scanning alerts #436 / #437) #2472(useSkillCatalog / useExternalRepos の子コンポーザブル抽出)で入った新しいパターン内の同一ファイル型ミラー: | ファイル | 重複箇所 | |---|---| | `src/plugins/manageSkills/useExternalRepos.ts` | private な `ReposState`(57-72行)と公開 `ExternalRepos`(74-96行)が同じ **11個の Ref フィールド**(`catalogRepos`, `repoCollapsed`, `addRepoOpen`, `addRepoUrl`, `addRepoSubpath`, `addRepoError`, `addRepoBusy`, `suggestions`, `selectedSuggestionUrl`, `uninstallingRepoId`, `updatingRepoId`)を二重列挙 | | `src/plugins/manageSkills/useSkillCatalog.ts` | private な `CatalogState`(48-59行)と公開 `SkillCatalog`(61-77行)が同じ **7個の Ref フィールド**(`catalogPresets`, `catalogExternal`, `catalogError`, `selectedCatalog`, `catalogDetail`, `catalogDetailLoading`, `catalogActioningKey`)を二重列挙 | 構造: State レコードは「Ref 群 + `t`/`endpoints`/`deps`」、公開インタフェースは「同じ Ref 群 + メソッド群」。Ref 部分が手書きで2回並ぶため、**フィールドを1つ追加すると2箇所の同期が必要**になり、片方だけ追加しても型エラーにならない(State にだけ足して公開し忘れる事故が静かに起きる)。 ## 提案(fold 方法) 共有 base interface を切って両者が `extends` する: ```ts interface CatalogRefs { catalogPresets: Ref<CatalogEntry[]>; // …Ref フィールドのみ } interface CatalogState extends CatalogRefs { t: TranslateFn; endpoints: SkillsEndpoints; deps: SkillCatalogDeps; } export interface SkillCatalog extends CatalogRefs { loadCatalog(): Promise<void>; /* …メソッド群 */ } ``` 型のみの変更で実行時影響なし。ファイル内完結なので依存方向の論点もない。 ## なぜ今すぐやらないか #2298 / #2301 の children 抽出シリーズ(#2472, #2476 など)が**現在進行中**で、同ファイルが続けて動いている。シリーズが落ち着いてから当てないと衝突・手戻りになる。**着手前に当該シリーズの open PR が無いことを確認すること。** ## 検証 `yarn typecheck` のみで十分(型のみ)。jscpd で #436/#437 のペア消滅を確認。
关闭于 26 天前 1 条评论