[解決済み] タイプスクリプトでenumをインデックスキーとして使用するには?
2023-01-19 09:25:36
質問
次のような例を考えてみましょう。
enum DialogType {
Options,
Help
}
class Dialog {
test() : string {
return "";
}
}
class Greeter {
openDialogs: { [key in DialogType]: Dialog | undefined } = {
0: undefined,
1: undefined
};
getDialog(t: DialogType) {
return this.openDialogs[t];
}
}
const greeter = new Greeter();
const d = greeter.getDialog(DialogType.Help);
if (d) document.write(d.test());
これには3つの問題・疑問があります。
- プロパティを '| undefined' と宣言しているにもかかわらず、イニシャライザー リテラルでプロパティを省略できない理由
- なぜ 'DialogType.Options' をタイプキーとして使用することができず、代わりにハードコードされた番号を使用しなければならないのでしょうか?
- なぜ 'key.DialogType' ではなく 'key in DialogType' を使用しなければならないのでしょうか?DialogType' の代わりに 'DialogType のキー' を使用しなければならないのでしょうか?(または、できますか?)
どのように解決するには?
-
|undefined
はプロパティをオプションにせず、単にundefined
にする案があります。|undefined
のメンバーをオプションにする案がありますが、現在は実装されていません。そのため?
の後に]
で全てのプロパティを省略可能にします。{ [key in DialogType]?: Dialog }
-
ダイアログの列挙値をキーとして使用することができますが、それらは計算されたプロパティである必要があります。
let openDialogs: { [key in DialogType]?: Dialog } = { [DialogType.Options]: undefined, };
-
{ [key: number or string]: Dialog }
はインデックス署名です。インデックス署名はnumber
またはstring
をキータイプとして使用します(この2つの和集合でもうまくいきません)。ですから、もしインデックスシグネチャを使うなら、任意のnumber
またはstring
(のみに制限することはできません。DialogType
キーに限定することはできません)。ここで使用している概念は、マッピングされた型と呼ばれるものです。マッピングされた型は、基本的にキー(この場合は DialogType enum のメンバ)とマッピングルールのセットからなるユニオンに基づいて新しい型を生成します。上で作成した型は、基本的にこれと同等です。let o: { [DialogType.Help]?: Dialog; [DialogType.Options]?: Dialog; }
関連
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] 辞書をキーでソートするにはどうしたらいいですか?
-
[解決済み] Pythonで'Enum'を表現するにはどうしたらいいですか?
-
[解決済み] typescriptでmoment.jsをインポートするには?
-
[解決済み] Angular 2で相対パスが非常に長いインポートを回避する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] TypeScriptで Object.keys return string[].
-
[解決済み] ts ES5/ES3の非同期関数やメソッドには、「Promise」コンストラクタが必要です。
-
[解決済み] Angular 2でアプリ起動時にサービスを実行する方法
-
[解決済み] 文字列ユニオンから文字列配列へ
-
[解決済み] tsc が `TS2307: Cannot find module` for a local file をスローします。
-
[解決済み] tsconfig.jsonのtargetは何のためにあるのですか?
-
[解決済み] Typescript のプリミティブ型:"number" と "Number" の違い(TSC は大文字と小文字を区別しない)?
-
[解決済み] ngForとAsync Pipe Angular 2でObservableオブジェクトから配列を利用する。
-
[解決済み] Typescript で Enum を制限付きキータイプとして使用する
-
[解決済み] TSにおける文字列列列挙型と文字列リテラル型の相違点