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:
@@ -8,6 +8,7 @@ export * from "./common"
|
||||
export * from "./content"
|
||||
export * from "./contest"
|
||||
export * from "./flowchart"
|
||||
export * from "./judge-status"
|
||||
export * from "./language"
|
||||
export * from "./problem"
|
||||
export * from "./problemset"
|
||||
|
||||
32
packages/contract/src/judge-status.ts
Normal file
32
packages/contract/src/judge-status.ts
Normal 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[]],
|
||||
)
|
||||
@@ -1,23 +1,9 @@
|
||||
import { z } from "zod"
|
||||
|
||||
import { paginatedSchema } from "./common"
|
||||
import { judgeStatusSchema, type JudgeStatus } from "./judge-status"
|
||||
import { problemLanguageSchema } from "./language"
|
||||
|
||||
export const judgeStatusSchema = z.union([
|
||||
z.literal(-2),
|
||||
z.literal(-1),
|
||||
z.literal(0),
|
||||
z.literal(1),
|
||||
z.literal(2),
|
||||
z.literal(3),
|
||||
z.literal(4),
|
||||
z.literal(5),
|
||||
z.literal(6),
|
||||
z.literal(7),
|
||||
z.literal(8),
|
||||
z.literal(10),
|
||||
])
|
||||
|
||||
/**
|
||||
* 判题机原始输出(`submission.info` 的 JSONB 原文)。**只是类型,不作运行时校验。**
|
||||
*
|
||||
@@ -397,7 +383,6 @@ export const formatCodeRequestSchema = z.object({
|
||||
|
||||
export const formatCodeResponseSchema = z.object({ code: z.string() })
|
||||
|
||||
export type JudgeStatus = z.infer<typeof judgeStatusSchema>
|
||||
export type StatisticInfo = z.infer<typeof statisticInfoSchema>
|
||||
export type CreateSubmissionRequest = z.infer<
|
||||
typeof createSubmissionRequestSchema
|
||||
|
||||
Reference in New Issue
Block a user