1. ホーム
  2. typescript

[解決済み] 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");
}

私もそのようなものを実装しており、とても重宝しています。