TypeScript エンム: `Object.values` 関数を用いて文字列リテラル型連合を作成

2024-07-27

TypeScript エンムから文字列リテラル型連合を作成する方法

keyof 演算子を用いる方法

最も一般的な方法は、keyof 演算子を用いて、エンムのキー(定数名)から文字列リテラル型連合を作成する方法です。

enum Direction {
  North,
  South,
  East,
  West
}

type DirectionString = keyof Direction; // "North" | "South" | "East" | "West"

この例では、Direction エンムのキーを DirectionString という型の文字列リテラル型連合として定義しています。DirectionString 型の変数には、Direction エンムの値である "North", "South", "East", "West" のいずれかを代入することができます。

Object.values 関数を用いる方法

Object.values 関数を用いて、エンムの値から文字列リテラル型連合を作成する方法もあります。

enum Direction {
  North,
  South,
  East,
  West
}

type DirectionString = typeof Direction[keyof Direction]; // "North" | "South" | "East" | "West"

const directionStrings: DirectionString[] = Object.values(Direction); // ["North", "South", "East", "West"]

この例では、Object.values 関数を用いて、Direction エンムの値をすべて取得し、directionStrings という配列に格納しています。directionStrings 配列の要素には、Direction エンムの値である "North", "South", "East", "West" のいずれかを代入することができます。

const アサーションを用いる方法

TypeScript 3.4 以降では、const アサーションを用いて、エンムの値から文字列リテラル型連合を作成する方法もあります。

enum Direction {
  North,
  South,
  East,
  West
}

const directionStrings: "North" | "South" | "East" | "West" = Direction; // "North" | "South" | "East" | "West"

TypeScript において、エンムから文字列リテラル型連合を作成する方法には、keyof 演算子を用いる方法、Object.values 関数を用いる方法、const アサーションを用いる方法の 3 種類があります。それぞれの方法にはメリットとデメリットがあるので、状況に応じて適宜選択しましょう。

メリット

  • 型安全性が高い
  • エンムの値を文字列として直接使用できる
  • コードが冗長になる
  • エンムの値を変更するたびに、文字列リテラル型連合を変更する必要がある



enum Direction {
  North,
  South,
  East,
  West
}

type DirectionString = keyof Direction; // "North" | "South" | "East" | "West"

function getDirectionString(direction: Direction): DirectionString {
  switch (direction) {
    case Direction.North:
      return "North";
    case Direction.South:
      return "South";
    case Direction.East:
      return "East";
    case Direction.West:
      return "West";
    default:
      throw new Error("Invalid direction");
  }
}

const northString: DirectionString = getDirectionString(Direction.North); // "North"
const southString: DirectionString = getDirectionString(Direction.South); // "South"
const eastString: DirectionString = getDirectionString(Direction.East); // "East"
const westString: DirectionString = getDirectionString(Direction.West); // "West"
enum Direction {
  North,
  South,
  East,
  West
}

type DirectionString = typeof Direction[keyof Direction]; // "North" | "South" | "East" | "West"

const directionStrings: DirectionString[] = Object.values(Direction); // ["North", "South", "East", "West"]

function isDirectionString(s: string): s is DirectionString {
  return directionStrings.includes(s);
}

const northString: DirectionString = "North"; // "North"
const southString: DirectionString = "South"; // "South"
const eastString: DirectionString = "East"; // "East"
const westString: DirectionString = "West"; // "West"
const invalidString: string = "Invalid"; // string

if (isDirectionString(invalidString)) {
  console.log("有効な方向文字列です:", invalidString);
} else {
  console.log("無効な方向文字列です:", invalidString);
}
enum Direction {
  North,
  South,
  East,
  West
}

const directionStrings: "North" | "South" | "East" | "West" = Direction; // "North" | "South" | "East" | "West"

function isDirectionString(s: string): s is DirectionString {
  return directionStrings === s;
}

const northString: DirectionString = "North"; // "North"
const southString: DirectionString = "South"; // "South"
const eastString: DirectionString = "East"; // "East"
const westString: DirectionString = "West"; // "West"
const invalidString: string = "Invalid"; // string

if (isDirectionString(invalidString)) {
  console.log("有効な方向文字列です:", invalidString);
} else {
  console.log("無効な方向文字列です:", invalidString);
}
  • 詳細については、TypeScript の公式ドキュメントを参照してください。



enum Direction {
  North,
  South,
  East,
  West
}

type DirectionString = typeof Direction[keyof Direction]; // "North" | "South" | "East" | "West"

function isDirectionString(s: string): s is DirectionString {
  return Object.values(Direction).includes(s as Direction);
}

function getDirectionString(direction: Direction): DirectionString | undefined {
  if (isDirectionString(direction)) {
    return direction;
  } else {
    return undefined;
  }
}

const northString: DirectionString | undefined = getDirectionString(Direction.North); // "North"
const southString: DirectionString | undefined = getDirectionString(Direction.South); // "South"
const eastString: DirectionString | undefined = getDirectionString(Direction.East); // "East"
const westString: DirectionString | undefined = getDirectionString(Direction.West); // "West"
const invalidString: DirectionString | undefined = getDirectionString("Invalid"); // undefined

この例では、isDirectionString 関数と getDirectionString 関数を使用して、エンムの値が文字列リテラル型連合に属しているかどうかを判断しています。

型エイリアスとジェネリック型を用いる方法

enum Direction {
  North,
  South,
  East,
  West
}

type DirectionString<T extends Direction> = keyof T;

const directionStrings: DirectionString<Direction> = Direction; // "North" | "South" | "East" | "West"

この例では、DirectionString 型エイリアスとジェネリック型を使用して、エンムの型から文字列リテラル型連合を作成しています。

in 演算子を用いる方法

enum Direction {
  North,
  South,
  East,
  West
}

type DirectionString = typeof Direction[keyof Direction]; // "North" | "South" | "East" | "West"

function isDirectionString(s: string): s is DirectionString {
  return s in Direction;
}

const northString: DirectionString | undefined = (Direction.North as DirectionString); // "North"
const southString: DirectionString | undefined = (Direction.South as DirectionString); // "South"
const eastString: DirectionString | undefined = (Direction.East as DirectionString); // "East"
const westString: DirectionString | undefined = (Direction.West as DirectionString); // "West"
const invalidString: DirectionString | undefined = ("Invalid" as DirectionString); // undefined

この例では、in 演算子を使用して、エンムの値がエンムオブジェクトに含まれているかどうかを判断しています。

TypeScript エンムから文字列リテラル型連合を作成するには、様々な方法があります。それぞれの方法にはメリットとデメリットがあるので、状況に応じて適宜選択しましょう。

  • すべての状況に適用できるわけではない
  • 理解が難しい

注意事項

  • 最新の TypeScript の機能を使用している場合は、新しい方法が利用できる可能性があります。

typescript enums



TypeScript で enum を作る方法

TypeScriptでは、enumというキーワードを使用して、特定の値のセットを定義することができます。これは、定数や列挙型のような役割を果たします。この例では、Colorという名前のenumを定義しています。このenumは、Red、Green、Blueという3つの値を持ちます。これらの値は、数値として内部的に表現されます。...


TypeScript で enum を作る方法

TypeScriptでは、enumというキーワードを使用して、特定の値のセットを定義することができます。これは、定数や列挙型のような役割を果たします。この例では、Colorという名前のenumを定義しています。このenumは、Red、Green、Blueという3つの値を持ちます。これらの値は、数値として内部的に表現されます。...


TypeScript メソッドオーバーロード 解説

TypeScriptでは、同じ名前の関数を複数の異なるシグネチャで定義することで、メソッドオーバーロードを実現できます。これにより、入力パラメータの種類や数に応じて異なる処理を行うことができます。基本的な方法例注意点オペレータオーバーロード TypeScriptでは、C++やJavaのようなオペレータオーバーロードはサポートされていません。つまり、+、-、*などの演算子の挙動を独自に定義することはできません。...


Knockout.jsとTypeScriptでシンプルTodoアプリを作ってみよう

Knockout. js は、JavaScript フレームワークであり、DOM 操作とデータバインディングを容易にすることで、Web アプリケーション開発を簡素化します。TypeScript は、JavaScript の静的型付けスーパーセットであり、型安全性を向上させ、開発者の生産性を高めることができます。...


TypeScriptとJavaScriptの違いは?

TypeScriptは、JavaScriptのスーパーセットであり、JavaScriptに静的型付けの機能を追加したプログラミング言語です。つまり、TypeScriptのコードはJavaScriptのコードとしても実行できますが、TypeScriptでは変数や関数の型を明示的に指定することができます。...



SQL SQL SQL SQL Amazon で見る



【徹底解説】JavaScriptとTypeScriptにおけるswitch文で同じコードを実行する2つの方法と注意点

この場合、以下の 2 つの方法で実現することができます。上記の例では、value が 1 または 3 の場合、console. log("値は 1 または 3 です"); が実行されます。同様に、value が 2 または 4 の場合、console


サンプルコードで解説! TypeScript で jQuery Autocomplete を使いこなす

jQuery の型定義ファイルの導入TypeScript で jQuery を利用するために、型定義ファイルが必要です。型定義ファイルは、jQuery の関数やプロパティの型情報を提供し、TypeScript の IntelliSense 機能でオートコンプリートやエラーチェックを有効にします。


軽量で効率的な TypeScript コード: 最小化の重要性とベストプラクティス

そこで、TypeScriptを最小化と呼ばれる手法でコンパイルすることで、コードサイズを削減し、実行速度を向上させることができます。最小化は、コメントや空白などの不要な文字列を削除し、変数名を短縮するなどの処理を行います。TypeScriptを最小化する方法


TypeScriptでHTMLElementの型アサート

TypeScriptでは、HTMLElementの型をアサートして、その要素に存在するメソッドやプロパティにアクセスすることができます。アサートは、変数に特定の型があることをコンパイラに伝えるための方法です。アサートの構文ここで、typeはアサートする型、expressionはアサートしたい値です。


TypeScript型定義ファイル作成ガイド

TypeScriptでJavaScriptライブラリを型付けするTypeScriptは、JavaScriptに静的型付け機能を追加する言語です。既存のJavaScriptライブラリをTypeScriptで使用するためには、そのライブラリの型定義ファイル(.d.tsファイル)を作成する必要があります。