'string' は '{}' 型のインデックスには使用できません。
質問
オブジェクトの配列からHTMLテーブルを生成する、以下のReactコンポーネントを持っています。表示されるべき列は
tableColumns
プロパティで定義されています。
をループする場合
items
をループし、正しいカラムを表示するために、私は
key
プロパティから
tableColumn
オブジェクトになります (
{item[column.key]}
) を作成しましたが、typescript は以下のようなエラーを発生させます。
string' 型の式は '{}' 型のインデックスに使用できないため、要素は暗黙的に 'any' 型を持ちます。 タイプ 'string' のパラメータを持つインデックス署名はタイプ '{}' に見つかりませんでした。
これを修正するにはどうしたらいいでしょうか?私は迷っています。
コンポーネントをどのように呼び出すか。
<TableGridView
items={[
{
id: 1,
name: 'John Doe',
email: '[email protected]'
},
{
id: 2,
name: 'Lorem ipsum',
email: '[email protected]',
}
]}
tableColumns={[
{
key: 'id',
label: 'ID',
},
{
key: 'name',
label: 'Name',
}
]}
/>
マイコンポーネントです。
export type TableColumn = {
key: string,
label: string,
};
export type TableGridViewProps = {
items: object[],
tableColumns: TableColumn[]
};
const TableGridView: React.FC<TableGridViewProps> = ({ tableColumns, items }) => {
return (
<table>
<tbody>
{items.map(item => {
return (
<tr>
{tableColumns.map((column, index) => {
return (
<td
key={column.key}
className="lorem ipsum"
>
{item[column.key]} // error thrown here
</td>
);
})}
</tr>
);
})}
</tbody>
</table>
);
}
どのように解決するのですか?
items: object[],
技術的には JavaScript のオブジェクトですが、型はより良いものになります。Typescript がオブジェクトのプロパティにアクセスする際の間違いを正しく認識できるようにするには、オブジェクトの正確な形状を伝える必要があります。もしあなたがそれを
object
とタイプした場合、typescript はそれを助けることができません。その代わりに、オブジェクトが持つ正確なプロパティとデータ型を伝えることができます。
let assistance: { safe: string } = { safe: 1 /* typescript can now tell this is wrong */ };
assistance.unknown; // typescript can tell this wont really work too
さて、オブジェクトがあらゆる種類のキーと値のペアを含むことができる場合、少なくともオブジェクトのインデックスタイプを使用することで、typescriptに値(とキー)がどのようなタイプであるかを伝えることができます。
items: {
[key: string]: number | string,
}[]
というのが、与えられたケースでの正確な型でしょう。
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] JavaScriptでクエリ文字列の値を取得するにはどうすればよいですか?
-
[解決済み] ngModel' は 'input' の既知のプロパティではないため、バインドできません。
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)