refactor(manageSkills): State レコードと公開インタフェースの Ref フィールド二重列挙(alerts #436/#437)— children 抽出シリーズ完了後に
## 何が重複しているか(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 条评论