enum の限界を理解し、as const で凍結した定数から型を導出しましょう。
このレッスンを Kodokon で開くenum は言語の初期からある機能で、多くのコードベースで出くわすでしょう。名前付き定数を1つの型のもとにまとめ、値としても注釈としても使えます。
enum Role {
User = "USER",
Admin = "ADMIN",
}
function canDelete(role: Role): boolean {
return role === Role.Admin;
}しかし現代のエコシステムは enum から離れつつあります。enum は JavaScript には存在しない構文です。コンパイラは実行時にオブジェクトを生成するため、一部のツールを複雑にし、erasableSyntaxOnly オプションとは互換性がありません。代替手段は、as const で凍結した素のオブジェクトで、そこから型を導出します。
const ROLES = {
User: "USER",
Admin: "ADMIN",
} as const;
type Role = (typeof ROLES)[keyof typeof ROLES];
function canDelete(role: Role): boolean {
return role === ROLES.Admin;
}as const は配列にも効きます。各要素は読み取り専用のリテラルになり、(typeof SIZES)[number] は値のユニオンを生み出します。単一の信頼できる情報源が、実行されるコードと型の両方を支えます。
const SIZES = ["sm", "md", "lg"] as const;
type Size = (typeof SIZES)[number];
function isSize(value: string): value is Size {
return (SIZES as readonly string[]).includes(value);
}