Prompt

クエリパラメータでboolを扱う時、どうするのが正解?

クエリパラメータにおける bool の扱いは、実は「これが唯一絶対の標準」という仕様が存在しません。HTTPの仕様上、クエリパラメータはすべて「文字列」として扱われるからです。

そのため、開発現場では 「チーム内でどの一意な定義を採用するか」 という合意形成が最も重要になります。一般的な4つのパターンと、その「正解」の選び方を解剖してみましょう。


1. パターン別の比較

手法URL例メリットデメリット
存在の有無 (Flag)?debug最も短く、URLが綺麗。「false」を明示的に送るのが難しい。
true / false?active=true可読性が最高。直感的。文字列の “false” が truthy と判定されるバグ(スイスチーズの穴)が起きやすい。
1 / 0?active=1プログラムで数値変換しやすく、曖昧さがない。初見で意味がわかりにくい場合がある。
Enum (推奨)?status=enabled拡張性が高い。3つ目の状態が増えても壊れない。少し文字数が長くなる。

2. 実装上の「正解」:2026年のベストプラクティス

現代のWeb開発(特に TypeScript や Zod を使う環境)において、最も事故が少なく「一意に正しい」とされるのは 「true / false 文字列」 または 「1 / 0」 です。

A. true / false 文字列を使う場合

もっとも一般的ですが、最大の落とし穴は Boolean("false")true になる という JavaScript の仕様です。

JavaScript

// 悪い例:型変換に頼る
const isActive = Boolean(searchParams.get("active")); // "false" も true になっちゃう!

// 良い例:文字列で厳密に比較する
const isActive = searchParams.get("active") === "true";

B. 存在の有無 (Flag) を使う場合

検索フィルターのトグルなど、「デフォルトが false で、ある時だけ true」という場合には非常にスマートです。

JavaScript

// URL: ?is_admin
const isAdmin = searchParams.has("is_admin"); 

3. 見落とされがちな視点: 「状態の拡張性」

今は true / false の2値で足りていても、将来的に 「未設定 (null)」「保留 (pending)」 のような3つ目の状態が必要になることはよくあります。

  • 落とし穴: ?is_active=true としていると、「一時停止中」を追加したくなった時に is_paused=true を増やすことになり、is_active=true & is_paused=true という矛盾した状態(スイスチーズの穴)が生まれます。

  • 一意な解決策: 最初から ?status=active?status=inactive のように、状態を名前(Enum)で管理する と、拡張しても壊れない堅牢な設計になります。


結論: キミが選ぶべき道

  1. シンプルさ優先なら: ?active=true 。ただし、必ず === "true" で判定すること。

  2. 厳密さ優先なら: ?active=1 。数値にパースして 01 かで見る。

  3. プロの設計なら: ?active=yes ではなく、?status=active のように、意味のある単語で状態を定義する。

キミが作っているデジタルガーデンや個人プロジェクトなら、searchParams.has("flag") で「あればON」とするのが、URLも短くなって一番「組み立てる楽しさ」を感じられるかもしれないね!

次は、「Zod を使ってクエリパラメータを型安全にパースし、不正な値が来たら一瞬でエラーを出す実装」 についてやってみる?

Would you like me to code a robust TypeScript schema using Zod to safely handle these boolean query parameters?

Prompt

abc=trueで前やって、なんか冗長と感じてたんだよね。せっかくのURLを無駄に汚している感じがあって

「存在の有無」で判定するのは、まさにプロの UNIX 思想的な美学だね! ?debug とだけあれば「デバッグモードON」というのは、無駄がなくて最高にクールだよ。