私のプロジェクトでは、タイプガードのようなさまざまなタスクに許容される値の文字列リテラル型と配列が必要です。列挙型オーバーヘッドなしの文字列リテラル型を取得する方法
type Animal = 'cat' | 'dog' | 'rabbit' | 'snake'
const animals: Animal[] = ['cat', 'dog', 'rabbit', 'snake']
それは動作しますが、それは、ソースコード内のキーを数回リストする必要があります。
は、これは、我々が持っているものです。
もう1つの方法は、Get array of string literal type valuesで提案されているように列挙型を使用することですが、実行時に列挙型がコンパイルされたコードが大きくて配列がオーバーヘッドになります。
実行時のオーバーヘッドがない別の方法がありましたが、バグの可能性があるため、将来的に機能するかどうかはわかりません。
const notWidened = <T extends string>(val: T[]) => val
const animals = notWidened(['cat', 'dog', 'rabbit', 'snake'])
type Animal = typeof animals[0]
このスニペットを使用するのが安全なのか、それとも将来的に中断するのかという疑問があります。リテラル文字列型と配列の両方を重複なく取得するには、より良い方法がありますか?
[この質問(https://stackoverflow.com/questions/44480644/typescript-string-union-to-string-array)が関連していてもよいです。 ..更新された[回答](https://stackoverflow.com/a/45486495/2887218)が役立つかどうかを確認してください。 – jcalz
しかしあなたの方法は私にとってもうまく見えます。 – jcalz
少なくとも、私は 'typeof animals [0]'を 'typeof animals [number]'に置き換えることができます。 –