web-dev-qa-db-ja.com

インデックスシグネチャを持つTypeScriptクラスを定義できますか?

IRawParamsと呼ばれるインターフェイスタイプがあり、これはstringキーとany valsを指定するだけです。

interface IRawParams {
    [key: string]: any
}

キー/値の上にいくつかの動作を含むParamValuesクラスがあります。 ParamValuesクラスがIRawParamsインターフェースを実装することを指定したいと思います。

class ParamValues implements IRawParams {
    parseFromUrl(urlString: string) {
        Parser.parse(urlString).forEach(item => this[item.key] = item.val);
    }
}

// so I can do something like this
var params = new ParamValues();
params.parseFromUrl(url);
var userId = params.userId;

これを試みると、コンパイラエラーが発生します。

エラーTS2420:クラス 'ParamValues'は、インターフェイス 'IRawParams'を正しく実装していません。タイプ 'ParamValues'にインデックス署名がありません。

クラスにIRawParamsインターフェイスを実装させるか、それともTypeScriptを取得してクラスのインスタンスにインデックス付きの型と互換性を持たせることができますか{[key: string]: any}

24
Chris T

インデックスシグネチャを持つクラスを定義するには、クラスにインデックスシグネチャを記述します。

interface IRawParams {
    [key: string]: any
}

class Foo implements IRawParams {
    [k: string]: any;
}
28
Ryan Cavanaugh