TypeScript の学習として、TypeScript と Commander.js で tino という小さなツールを作り始めました。
最初に作ろうとしたのは、Task を追加する次のようなコマンドです。
tino task add <title>
1. 失敗
最初は add を文字列で判定しようとして、以下のようなコードを書きました。
import { Command } from "commander";
const program = new Command();
program
.command("task")
.argument("<cmd>")
.argument("<title>")
.action((cmd, title) => {
if (cmd === "add") {
console.log(`Adding ${title}`);
}
});
task の下にさらに add を .command() で作れると思っていませんでした。
そのため、add をコマンドとして定義するのではなく、文字列引数として受けて判定しようとしていました。
2. 解決
Commander.js では、.command("task") で作ったコマンドの下に、さらに .command("add <title>") を定義できます。
修正後のコードです。
import { Command } from "commander";
const program = new Command();
const task = program
.command("task")
.description("Task を操作する");
task
.command("add <title>")
.description("Task を追加する")
.action((title) => {
console.log(`Adding ${title}`);
});
3. 学んだこと
task add のような階層を作りたいときは、add を文字列として判定するのではなく、task の下のコマンドとして定義した方が自然だと分かりました。
Commander.js を触り始めた人で、同じように困った人の助けになれば幸いです。