AzLearn

تمرين إعادة البناء

Form State Machine

أعد كتابة آلة حالات نموذج TypeScript باستخدام unions للأحداث والحالات.

typescript ~16 دقيقة متوسط
أعد بناء الكود Rebuild

هذا هو الكود. اكتبه بنفسك.

الكود المرجعي
type FormState =
  | { status: "editing"; values: Record<string, string> }
  | { status: "submitting"; values: Record<string, string> }
  | { status: "success"; message: string }
  | { status: "error"; values: Record<string, string>; message: string };

type FormAction =
  | { type: "change"; field: string; value: string }
  | { type: "submit" }
  | { type: "success"; message: string }
  | { type: "failure"; message: string };

function updateForm(state: FormState, event: FormAction): FormState {
  if (event.type === "change" && state.status !== "success") {
    return {
      status: "editing",
      values: { ...state.values, [event.field]: event.value },
    };
  }

  if (event.type === "submit" && (state.status === "editing" || state.status === "error")) {
    return { status: "submitting", values: state.values };
  }

  if (event.type === "success" && state.status === "submitting") {
    return { status: "success", message: event.message };
  }

  if (event.type === "failure" && state.status === "submitting") {
    return { status: "error", values: state.values, message: event.message };
  }

  return state;
}

let state: FormState = { status: "editing", values: {} };
state = updateForm(state, { type: "change", field: "email", value: "[email protected]" });
state = updateForm(state, { type: "submit" });
state = updateForm(state, { type: "success", message: "Saved" });

console.log(state);
اكتب هنا