refactor(契约): 判题状态码收进契约唯一一份,并收紧 18 处 as any

- 状态码常量与 judgeStatusSchema 移到 packages/contract/src/judge-status.ts,
  后端 judge/status.ts 只再导出;前端 SubmissionStatus 枚举加编译期断言对齐契约
  (实测改坏一个码会当场类型检查失败)
- 类型逃逸 22 处降到 4 处:collab/handler、pagination、configUpdate、
  ExerciseManager、ProblemSubmission、pk.vue tooltip;剩下的是词云插件无类型、
  生成的 .d.ts、skulpt 和 TextEditor

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Sonnet 5 committed 2026-09-19 04:40:30 -06:00
1 parent f90d01338e
commit b5ba56ccd0
11 files changed
+77 -51

No files matched your search

+32
View File
@@ -0,0 +1,32 @@
import { z } from "zod"
/**
* 判题状态码 —— **前后端唯一的一份**。
*
* 这些整数是落库的值:12 万条历史提交的 `submission.result` 就是它们,判题沙箱回的
* 也是这套编码,所以只能新增、不能改已有的含义。后端 `judge/status.ts` 从这里再导出,
* 前端 `utils/constants.ts` 的 `SubmissionStatus` 用类型断言逐条对齐这里。
*/
export const JudgeStatus = {
COMPILE_ERROR: -2,
WRONG_ANSWER: -1,
ACCEPTED: 0,
CPU_TIME_LIMIT_EXCEEDED: 1,
REAL_TIME_LIMIT_EXCEEDED: 2,
MEMORY_LIMIT_EXCEEDED: 3,
RUNTIME_ERROR: 4,
SYSTEM_ERROR: 5,
PENDING: 6,
JUDGING: 7,
PARTIALLY_ACCEPTED: 8,
AST_CHECK_FAILED: 10,
} as const
export type JudgeStatusValue = (typeof JudgeStatus)[keyof typeof JudgeStatus]
// 同名的类型:原来契约里就有 `type JudgeStatus`(各处按类型引用),值与类型同名合并
export type JudgeStatus = JudgeStatusValue
export const judgeStatusSchema = z.literal(
Object.values(JudgeStatus) as [JudgeStatusValue, ...JudgeStatusValue[]],
)