私は活字体でこの定数を作成する場合:TypeScriptで値の型を指定できますが、引き続きTSでキーの型を推測させることはできますか?
const PARAMS = {
green: {color: 0x007700},
black: {color: 0x000000},
white: {color: 0xffffff},
};
それは{ green: {color: number}; black: { color: number }; white: { color: number }; }
ようなタイプを推論します。
しかし、値のタイプはTHREE.MeshBasicMaterialParameters
である必要があります。
const PARAMS: {[name: string]: THREE.MeshBasicMaterialParameters} = {
green: {color: 0x007700},
black: {color: 0x000000},
white: {color: 0xffffff},
};
をその後私は、キーの特定可能性を失う(「緑」、「黒」又は「白」):私は、インデックス付きのタイプを使用してこれを宣言することができます。
const PARAMS: {
green: THREE.MeshBasicMaterialParameters,
black: THREE.MeshBasicMaterialParameters,
white: THREE.MeshBasicMaterialParameters
} = {
green: {color: 0x007700},
black: {color: 0x000000},
white: {color: 0xffffff},
};
しかし、これはかなり冗長で繰り返しです。私はそれをより正確にモデル化することができます。
もっと簡潔にしたいタイプを手に入れる方法はありますか?
私は 'inferColorKeys'トリックが好きです。それを一般的なものにすることは可能ですか? 'const PARAMS = inferKeys({...});'と書いて、中間型を作成しないようにするには? –
danvk
関数がいくつかの一般的なパラメータを明示的にも、推測的にも持つことができないので、それほど簡単ではありません。バイパスする方法は、明示的な汎用パラメータを取るさらに別の中間関数を追加することですが、私が試してみると、その型の推論は、値型のための 'THREE.MeshBasicMaterialParameters'の代わりに' {color:number'}に戻ります。もっと考える必要がある。 – artem
'const inferKeys =()=>(x:Record )のようなものがあります:レコード => x;'? –
jcalz