// 审稿历史归一:把后端 ReviewHistoryItem 的松散 conflicts(dict[])收紧成 ReviewConflict[]。 // 纯逻辑(可单测);schema 把 conflicts 标成 {[k]:unknown}[],这里安全收窄。 import type { ReviewHistoryItem } from "@/lib/api/types"; import type { ReviewConflict } from "./sse"; function asString(v: unknown, fallback = ""): string { return typeof v === "string" ? v : fallback; } function asStringArray(v: unknown): string[] { if (!Array.isArray(v)) return []; return v.filter((x): x is string => typeof x === "string"); } // 把一条留痕的 conflicts 收紧(缺字段给安全默认;保持顺序=下标身份,对齐冲突 gate)。 export function normalizeConflicts( item: ReviewHistoryItem | undefined, ): ReviewConflict[] { const raw = item?.conflicts ?? []; return raw.map((c) => ({ type: asString(c["type"], "未分类"), where: asString(c["where"]), refs: asStringArray(c["refs"]), suggestion: asString(c["suggestion"]), })); } // 最近一条留痕(GET .../reviews 已按新→旧排序)。 export function latestReview( items: readonly ReviewHistoryItem[] | undefined, ): ReviewHistoryItem | undefined { return items?.[0]; }