現在、文字列の配列と、同じ文字列を含む文字列リテラルのユニオン型の両方があります。
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];