TypeScript 配列から文字列リテラル型への変換 質問する

TypeScript 配列から文字列リテラル型への変換 質問する

現在、文字列の配列と、同じ文字列を含む文字列リテラルのユニオン型の両方があります。

const furniture = ['chair', 'table', 'lamp'];
type Furniture = 'chair' | 'table' | 'lamp';

アプリケーションでは両方が必要ですが、コードを DRY に保とうとしています。一方から他方を推測する方法はありますか?

基本的には のように言いたいのでtype Furniture = [any string in furniture array]、重複する文字列はありません。

ベストアンサー1

TypeScript 3.4以上

TypeScript バージョン 3.4 では、いわゆる **const コンテキスト** が導入されました。これは、タプル型を不変として宣言し、狭いリテラル型を直接取得する方法です (以下に示す 3.0 ソリューションのような関数を呼び出す必要はありません)。

この新しい構文を使用すると、次のような簡潔なソリューションが得られます。

const furniture = ['chair', 'table', 'lamp'] as const;
type Furniture = typeof furniture[number];

新しいconstコンテキストの詳細については、このPRをご覧ください。また、リリースノート

TypeScript 3.0以上

string[]ジェネリック残りパラメータを使用すると、リテラルタプル型として正しく推論し、リテラルのユニオン型を取得する方法があります。

こんなふうになります:

const tuple = <T extends string[]>(...args: T) => args;
const furniture = tuple('chair', 'table', 'lamp');
type Furniture = typeof furniture[number];

汎用レストパラメータの詳細

おすすめ記事