web-dev-qa-db-fra.com

Comment ajouter une signature d'index dans TypeScript

J'essaie d'utiliser réduire avec TypeScript pour atteindre un nombre total de messages entrants. Je ne sais pas trop comment ajouter une signature d'index. Je reçois toujours l'erreur: "L'élément a implicitement un type 'any' car le type '{}' n'a pas de signature d'index." sur les variables newArray et count [k]. J'ai lu plusieurs questions similaires, mais je n'ai pas compris comment les appliquer à mon scénario spécifique. Je suis nouveau sur JavaScript et TypeScript.

Voici mon tableau:

        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' }
    ];

Voici comment j'ai besoin de ma matrice pour l'utiliser dans un graphique de recharge:

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

Avec l'aide de la réponse "Just a Student" de cette question Stack Overflow: Grouper et compter les valeurs dans un tablea , j'ai ce qui suit.

        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);

Où et comment déclarer une signature d'index? Voici différentes choses que j'ai essayées.

  • let newArray: { [time: string] }; Et recevez une erreur d'identification en double.

  • l'ajout d'une chaîne au paramètre var counts = data.reduce((newA:string, item) me donne une erreur "L'élément a implicitement un type 'any' car l'expression d'index n'est pas de type 'number'."

  • l'ajout de newA[time].toString() me donne des erreurs, "Le côté gauche d'une expression d'affectation doit être une variable ou un accès à une propriété."

5
Bethany

Si je vous comprends, vous devez créer l'interface pour l'objet ...

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);
0