1. ホーム
  2. arrays

[解決済み] TypeScriptの配列を文字列リテラルに変換するタイプ

2022-08-16 01:18:02

質問

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

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

私は自分のアプリケーションで両方が必要ですが、私は自分のコードをDRYに保とうとしています。そこで、他から一方を推論する方法はあるのでしょうか?

私は基本的に次のようなことを言いたいのです。 type Furniture = [any string in furniture array] のように、文字列が重複しないようにしたい。

どのように解決するのですか?

TypeScript 3.0に対応したアップデート。

一般的なレストパラメータを使用することで、正しく string[] をリテラルタプル型として正しく推論し、その後リテラルのユニオン型を取得する方法があります。

このようになります。

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

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

TypeScript 3.4へのアップデート。

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

この新しい構文により、私たちはこの素晴らしい簡潔な解決策を得ることができます。

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

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