[解決済み] noImplicitAnyフラグを有効にしてtypescriptをコンパイルすると、"Index signature of object type implicitly has an 'any' type "というエラーが発生しますが、どうすれば防ぐことができますか?
質問
私はいつも --noImplicitAny というフラグを付けて Typescript をコンパイルしています。これは、型チェックを可能な限り厳しくしたいので、理にかなっています。
私の問題は、次のコードでエラーが発生することです。
Index signature of object type implicitly has an 'any' type
:
interface ISomeObject {
firstKey: string;
secondKey: string;
thirdKey: string;
}
let someObject: ISomeObject = {
firstKey: 'firstValue',
secondKey: 'secondValue',
thirdKey: 'thirdValue'
};
let key: string = 'secondKey';
let secondValue: string = someObject[key];
重要なのは、key変数がアプリケーションのどこかから来たもので、オブジェクト内のどのkeyでも良いという考え方です。
によって明示的に型をキャストしてみたのですが、どうでしょうか?
let secondValue: string = <string>someObject[key];
それとも、私のシナリオは
--noImplicitAny
?
解決方法は?
インデックスシグネチャを追加することで、TypeScriptに型がどうあるべきかを知らせることができます。
あなたの場合、それは
[key: string]: string;
interface ISomeObject {
firstKey: string;
secondKey: string;
thirdKey: string;
[key: string]: string;
}
しかし、これでは、すべてのプロパティタイプがインデックスシグネチャと一致するように強制されます。すべてのプロパティが
string
が動作します。
インデックス・シグネチャは配列や「辞書」パターンを記述する強力な方法ですが、同時にすべてのプロパティが戻り値の型と一致することを強制します。
編集する
型が一致しない場合は、ユニオン型を使用することができる
[key: string]: string|IOtherObject;
ユニオン型では、型を定義するのではなく、TypeScriptに型を推論させるのがよいでしょう。
// Type of `secondValue` is `string|IOtherObject`
let secondValue = someObject[key];
// Type of `foo` is `string`
let foo = secondValue + '';
しかし、インデックスシグネチャに多くの異なるタイプがある場合、少し面倒になります。その代わりとして
any
をシグネチャに含めることができます。
[key: string]: any;
そして、上でやったように型をキャストする必要があります。
関連
-
[解決済み】「TS2532: Object is possibly 'undefined'」というエラーを解決するにはどうしたらいいですか?
-
[解決済み】プロパティ 'value' が 'HTMLElement' 型の値に存在しない。
-
[解決済み] TypeScriptの円形型参照
-
[解決済み] 2つのインターフェイスを統合する
-
ts 学習日記1 AssertionError [ERR_ASSERTION]: タスク関数を指定する必要があります
-
[解決済み] メインとテストのコンパイルを分離するために、typescriptコンパイラ(tsc)のオプションはどのように設定するのが正しいのでしょうか?
-
[解決済み] TypeScriptのクラス型チェック
-
[解決済み】文字列型の式はインデックスに使えないので、要素は暗黙のうちにany型になる
-
[解決済み】タイプライター。TS7006: パラメータ 'xxx' は暗黙のうちに 'any' 型を持つ。
-
[解決済み] タイプスクリプトです。タイプ '{ "A": string; }' で 'string' 型のパラメータを持つインデックス署名が見つかりませんでした。
最新
-
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 : require文はimport文の一部ではない
-
[解決済み】tsconfigファイルにおけるesModuleInteropの理解
-
[解決済み] error TS2339: Property 'x' does not exist on type 'Y'.
-
[解決済み] ts1206 デコレーターはここでは無効です、Angular 2。
-
[解決済み] 'unknown' vs. 'any'
-
[解決済み] TypeScriptのファイル変更時にts-nodeを監視して再読み込みする方法
-
[解決済み】TypeScriptで型をnullableとして宣言する方法は?
-
[解決済み】文字列の値を持つenumの作成
-
[解決済み】WebStorm/PhpStormのダブルクォートでTypeScriptの自動インポートを行う。
-
[解決済み】TypescriptのArray<Type> VS Type[]について