refactor(web): hasApplicableFix 改类型谓词,消除 applyConflictFix 强转

hasApplicableFix 重写为对象入参类型谓词 patch is ApplicablePatch,谓词命中后 applyConflictFix 里 original/replacement 自动收窄为 string,删两处 as string;补收窄单测。
This commit is contained in:
Yaojia Wang
2026-07-08 13:27:45 +02:00
parent d80d41a08d
commit 9cf4915d49
2 changed files with 45 additions and 19 deletions

View File

@@ -4,12 +4,26 @@ import { applyConflictFix, hasApplicableFix } from "./applyFix";
describe("hasApplicableFix", () => {
it("requires non-empty original and string replacement", () => {
expect(hasApplicableFix("迈巴赫", "奔驰")).toBe(true);
expect(hasApplicableFix("删我", "")).toBe(true); // 空串=删除,仍可应用
expect(hasApplicableFix(null, "奔驰")).toBe(false);
expect(hasApplicableFix("", "奔驰")).toBe(false);
expect(hasApplicableFix("迈巴赫", null)).toBe(false);
expect(hasApplicableFix(undefined, undefined)).toBe(false);
expect(hasApplicableFix({ original: "迈巴赫", replacement: "奔驰" })).toBe(true);
// 空串=删除,仍可应用
expect(hasApplicableFix({ original: "删我", replacement: "" })).toBe(true);
expect(hasApplicableFix({ original: null, replacement: "奔驰" })).toBe(false);
expect(hasApplicableFix({ original: "", replacement: "奔驰" })).toBe(false);
expect(hasApplicableFix({ original: "迈巴赫", replacement: null })).toBe(false);
expect(hasApplicableFix({ original: undefined, replacement: undefined })).toBe(
false,
);
});
it("narrows original/replacement to string when true (type predicate)", () => {
const patch: { original: string | null; replacement: string | null } = {
original: "迈巴赫",
replacement: "奔驰",
};
if (!hasApplicableFix(patch)) throw new Error("expected applicable");
// 编译期收窄:无需强转即可当 string 拼接(`as string` 已消除)。
const combined: string = patch.original + patch.replacement;
expect(combined).toBe("迈巴赫奔驰");
});
});