AzLearn

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

Command Router

أعد كتابة موجّه أوامر TypeScript يقرأ argv ويفرّع حسب الأمر.

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

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

الكود المرجعي
declare const process: {
  argv: string[];
  exit(code?: number): never;
};

type CommandName = "greet" | "sum" | "help";

interface Command {
  name: CommandName;
  run(args: string[]): string;
}

function parseNumber(value: string): number {
  const parsed = Number(value);

  if (!Number.isFinite(parsed)) {
    throw new Error(`Invalid number: ${value}`);
  }

  return parsed;
}

const commands: Command[] = [
  {
    name: "greet",
    run: (args) => `Hello, ${args[0] ?? "friend"}!`,
  },
  {
    name: "sum",
    run: (args) => String(args.map(parseNumber).reduce((total, value) => total + value, 0)),
  },
  {
    name: "help",
    run: () => "Commands: greet <name>, sum <numbers>",
  },
];

function route(argv: string[]): string {
  const [rawName = "help", ...args] = argv;
  const command = commands.find((candidate) => candidate.name === rawName);

  if (!command) {
    throw new Error(`Unknown command: ${rawName}`);
  }

  return command.run(args);
}

try {
  console.log(route(process.argv.slice(2)));
} catch (error: unknown) {
  console.error(error instanceof Error ? error.message : "Unknown error");
  process.exit(1);
}
اكتب هنا