объявление типа для массива в typescript

#typescript #types

#typescript #типы

Вопрос:

извините, вопрос новичка…

я пытался найти способ объявить этот допустимый тип переменной ‘counts’.

   const rawData = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];

  const getCountData = (rawData: string[]) => {
    const counts: Map<string, number>[] = [];
    rawData.forEach((x: string) => {
      counts[x] = (counts[x] || 0)   1; 
    });
    
    return Object.values(counts);
  }
  

при использовании чистого javascript без объявления типа результат выглядит следующим образом:

[ a: 3, b: 2, c: 2, d: 2, e: 2, f: 1, g: 1, h: 3 ]

count[x] жалуется на несоответствие типа в typescript

Тип ‘String’ не может использоваться в качестве индексного типа.ts(2538)

есть какая-нибудь ссылка, с которой я могу свериться?

Комментарии:

1. String и string — это разные типы

Ответ №1:

В typescript

 Map<String, Number>[]
  

означает массив Map<Строка, число>. Из вашего кода вы получаете карту, а не массив карт.

Вы должны использовать объект ( {} ), а не массив ( [] ).

Кроме того, вы можете определить объект со строкой в качестве ключа и числом в качестве значения с помощью

 const counts: { [key: string]: number } = {};
  

Весь ваш правильно введенный код был бы:

 const getCountData = (rawData: string[]): number[] => {
    const counts: { [key: string]: number } = {};
    rawData.forEach((x: string) => {
      counts[x] = (counts[x] || 0)   1; 
    });
    
    return Object.values(counts);
  }
  

Комментарии:

1. Какую ошибку вы получаете? Проверьте typescript playground, он работает правильно