[解決済み] error TS2339: Property 'x' does not exist on type 'Y'.
2022-02-03 10:12:29
質問
このコードでTypeScriptエラーが発生する理由がわかりません。 (オリジナルのコードではなく、少し派生したコードなので、例の中の無意味な部分は無視してください)。
interface Images {
[key:string]: string;
}
function getMainImageUrl(images: Images): string {
return images.main;
}
エラーが発生します(TypeScript 1.7.5使用)。
error TS2339: Property 'main' does not exist on type 'Images'.
もちろん、書き込み時のエラーは解消できたのですが。
return images["main"];
プロパティへのアクセスに文字列を使用しないほうがいいのですが。どうしたらいいでしょうか?
どのように解決するのですか?
にアクセスできるようにしたい場合
images.main
の場合、明示的に定義する必要があります。
interface Images {
main: string;
[key:string]: string;
}
function getMainImageUrl(images: Images): string {
return images.main;
}
Typescriptはオブジェクトがそのプロパティを持っているかどうかを知る方法がないため、ドット記法を使ってインデックス付きのプロパティにアクセスすることはできません。
しかし、プロパティを具体的に定義すると、コンパイラーはそのプロパティの有無、オプションかどうか、型が何であるかを知ることができます。
編集
マップインスタンス用のヘルパークラスみたいなのを用意するといい。
class Map<T> {
private items: { [key: string]: T };
public constructor() {
this.items = Object.create(null);
}
public set(key: string, value: T): void {
this.items[key] = value;
}
public get(key: string): T {
return this.items[key];
}
public remove(key: string): T {
let value = this.get(key);
delete this.items[key];
return value;
}
}
function getMainImageUrl(images: Map<string>): string {
return images.get("main");
}
私もそのようなものを実装しており、とても重宝しています。
関連
-
ts 学習日記1 AssertionError [ERR_ASSERTION]: タスク関数を指定する必要があります
-
[解決済み] TypeScriptでグローバル変数を作成する
-
[解決済み] TypeScriptの非同期関数でプロミスを返す
-
[解決済み] エラー TS2345: 型 'T' の引数は型 'object' のパラメータに代入できません。
-
[解決済み] TypeScriptでオブジェクトに動的にプロパティを割り当てるには?
-
[解決済み] TypeScriptのオブジェクトリテラルでの型定義
-
[解決済み] TypeScriptのクラス型チェック
-
[解決済み】ランタイムにオブジェクトのクラス名を取得する
-
[解決済み】タイプ 'EventTarget' にプロパティ 'value' が存在しない。
-
[解決済み】Typescriptのパラメータ名のクエスチョンマークとは?
最新
-
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で、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み】tsconfigファイルにおけるesModuleInteropの理解
-
[解決済み] タイプスクリプトのコンパイルで「tsc コマンドが見つかりません。
-
TS1128: 宣言または声明が必要です。
-
[解決済み] as "というキーワードは何を意味するのでしょうか?
-
[解決済み] Typescriptでオブジェクトのプロパティを結合する方法は?
-
[解決済み] オプションのパラメータを省略しながら、他のオプションのパラメータを渡すには?
-
[解決済み] async/await構文で拒否する方法は?
-
[解決済み】Visual Studio Codeで.js.mapファイルを非表示にする方法
-
[解決済み】tsconfig.jsonファイルを生成するにはどうしたらいいですか?