PHPの`or die()`をTypeScriptで(適切な型ナロイング付き)
Translating with AI…
Translating with AI…
時には古い方法が最善である場合もあります。
PHPには、TypeScriptの開発者がひそかにうらやむパターンがあります:
$config = getenv('API_KEY') or die('Missing API_KEY');
1行で、値を取得するかメッセージとともにクラッシュするか。if文もなければ、try-catchもない。ただインラインでのエラーハンドリング。
これをTypeScriptに持ち込みました。
import { DIE } from "phpdie";
const apiKey = process.env.API_KEY ?? DIE("Missing API_KEY");
// TypeScriptはapiKeyがstringであり、string | undefinedではないことを知っています
これだけです。API_KEYが未定義の場合、プログラムは「Missing API_KEY」と共にクラッシュします。存在する場合は、適切な型ナロイングで値を取得します。
魔法はnever型の戻り値にあります:
export function DIE(reason?: string | Error): never {
if (typeof reason === "string") {
const err = new Error(reason);
throw err.stack;
}
throw reason;
}
neverはTypeScriptに「この関数は通常の方法で戻ることがない」と伝えます。コンパイラはこれを型ナロイングに使用します。
以下を書くと:
const value = possiblyUndefined ?? DIE("error");
TypeScriptは以下と考えます:
possiblyUndefinedが定義されている場合 → それを返すpossiblyUndefinedが未定義の場合 → DIE()が実行され、決して戻らないvalueは定義済みの型である必要があるもはやstring | undefinedではなく、ただのstringです。
const config = {
apiKey: process.env.API_KEY ?? DIE("Missing API_KEY"),
dbUrl: process.env.DATABASE_URL ?? DIE("Missing DATABASE_URL"),
port: parseInt(process.env.PORT ?? DIE("Missing PORT")),
};
// すべてのフィールドが未定義でないことが保証されます
const response = await fetch(url) ?? DIE("Fetch failed");
const data = await response.json() ?? DIE("Invalid JSON");
const user = data.users[0] ?? DIE("No users found");
// 各ステップがインラインで検証されます
const settings = config.settings ?? DIE("Missing settings");
const theme = settings.theme ?? DIE("Missing theme");
// ネストされたif文はありません
UIアラートを表示してから停止したいですか?
import { DIES } from "phpdie";
const value = getValue() ?? DIES(alert, "Something went wrong!");
// アラートを表示してからスロー
DIESは最初に関数を呼び出してからスローします:
export function DIES(alertFn: Function, ...args: any[]): never {
alertFn(...args);
throw new Error("DIES", { cause: args });
}
どのアラート関数でも動作します:
alert()console.error()toast.error()Sentry.captureException()const apiKey = process.env.API_KEY;
if (!apiKey) {
throw new Error("Missing API_KEY");
}
// これでapiKeyはstring
const dbUrl = process.env.DATABASE_URL;
if (!dbUrl) {
throw new Error("Missing DATABASE_URL");
}
// これでdbUrlはstring
2つの変数で8行。
const apiKey = process.env.API_KEY ?? DIE("Missing API_KEY");
const dbUrl = process.env.DATABASE_URL ?? DIE("Missing DATABASE_URL");
2行。同じ型安全性。
npm install phpdie
import { DIE, DIES } from "phpdie";
適している用途:
不適な用途:
時には最もシンプルな解決策が最善です。
PHPのor die()パターンは何十年も存在しています。洗練されていません。「クリーンアーキテクチャ」でもありません。しかし、うまく機能します。
TypeScriptの型システムはこのパターンを型安全にするほど強力です。neverがその鍵で、コンパイラに「この分岐はここで終了する」と伝えます。
シンプルなパターンを受け入れ、型安全にし、コードをリリースしましょう。
インストール: npm install phpdie
GitHub: github.com/snomiao/phpdie
const answer = getAnswer() ?? DIE("No answer found");
Snowstar Miaoは時折PHPを評価しています。