web-dev-qa-db-ja.com

TypeScriptでインデックス署名を追加する方法

TypeScriptでreduceを使用して、着信メッセージの総数に到達しようとしています。インデックスシグネチャを追加する方法について混乱しています。 「タイプ '{}'にはインデックスシグネチャがないため、要素には暗黙的に 'any'タイプがあります。変数newArrayおよびcounts [k]。私はいくつかの同様の質問を読みましたが、それらを私の特定のシナリオに適用する方法を理解していません。 JavaScriptとTypeScriptは初めてです。

これが私の配列です:

_        var data = [
        { time: '9:54' }, 
        { time: '9:54' },
        { time: '9:54' },
        { time: '9:55' }, 
        { time: '9:55' },
        { time: '9:55' },
        { time: '9:55' },
        { time: '9:56' }, 
        { time: '9:56' },
        { time: '9:56' },
        { time: '9:56' },
        { time: '9:57' }, 
        { time: '9:57' },
        { time: '9:57' },
        { time: '9:57' },
        { time: '9:57' }
    ];
_

これは、再グラフグラフで使用するために配列が必要な方法です。

_        var dataWithCounts = [
        { time: '9:54', messages: 3 }, 
        { time: '9:55', messages: 4 }, 
        { time: '9:56', messages: 4 }, 
        { time: '9:57', messages: 5 }
    ];
_

このスタックオーバーフローの質問からの「ちょうど学生の」答えの助けを借りて、 配列内のグループとカウント値 、私は以下を持っています。

_        var counts = data.reduce((newArray, item) => {
           let time = item.time;
           if (!newArray.hasOwnProperty(time)) {
               newArray[time] = 0;
           } 
           newArray[time]++;
           return newArray;
        }, {});

        console.log(counts);

        var countsExtended = Object.keys(counts).map(k => {
           return { time: k, messages: counts[k] };
       });

       console.log(countsExtended);
_

インデックスシグネチャはどこでどのように宣言しますか?以下は、私が試したさまざまなものです。

  • _let newArray: { [time: string] };_および重複識別子エラーを受け取ります。

  • パラメータvar counts = data.reduce((newA:string, item)に文字列を追加すると、「インデックス式はタイプ 'number'ではないため、要素は暗黙的に 'any'タイプになります。

  • newA[time].toString()を追加すると、「割り当て式の左側は変数またはプロパティアクセスである必要があります」というエラーが表示されます。

5
Bethany

私があなたを理解しているなら、オブジェクトのインターフェースを作成する必要があります...

interface counts_t{
    time?: string,
    messages?: number
}

var data: counts_t[] = [
    { time: '9:54' }, 
    { time: '9:55' }, 
    { time: '9:56' }, 
    { time: '9:57' }
];

    var counts = data.reduce((newArray:counts_t, item:counts_t) => {
       let time = item.time;
       if (!newArray.hasOwnProperty(time)) {
           newArray[time] = 0;
       } 
       newArray[time]++;
       return newArray;
    }, {});

    console.log(counts);

    var countsExtended: counts_t[] = Object.keys(counts).map(k => {
       return { time: k, messages: counts[k] };
    });

   console.log(countsExtended);