В этом уроке мы поговорим про массивы. TypeScript умеет выводить их тип, как и в случае с примитивными типами данных:
const fruits = ['banana', 'mango', 'apple'];
// Все работает
const upperFruits = fruits.map((name) => name.toUpperCase());
// А так уже нет
// Property 'key' does not exist on type 'string'.
const upperFruits = fruits.map((name) => name.key);
Массив — это составной тип данных, который представляет собой контейнер для другого типа. Например, тип «массив чисел» или «массив строк» — это контейнеры, содержащие в себе строки или числа.
Чтобы обозначить такой тип, используются квадратные скобки: number[]
, string[]
.
Определение массива выше можно было бы записать так:
const fruits: string[] = ['banana', 'mango', 'apple'];
Так же описываются типы в определении функций:
function toUpperArray(items: string[]): string[] {
return items.map((s) => s.toUpperCase());
}
В заключении можно сказать, что массивы могут быть полезными инструментами при работе с данными.
Анаграммы — это слова, которые состоят из одинаковых букв. Например:
спаниель — апельсин
карат — карта — катар
топор — ропот — отпор
Реализуйте функцию filterAnagrams()
, которая находит все анаграммы слова. Функция принимает исходное слово и список для проверки — массив. А возвращает функция массив всех анаграмм. Если в списке нет анаграммы, то возвращается пустой массив:
filterAnagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']);
// ['aabb', 'bbaa']
filterAnagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer']);
// ['carer', 'racer']
filterAnagrams('laser', ['lazing', 'lazy', 'lacer']);
// []
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1import * as ta from 'type-assertions';
2
3import filterAnagrams from './index';
4
5test('function', () => {
6 expect(filterAnagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada'])).toEqual(['aabb', 'bbaa']);
7
8 expect(filterAnagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer'])).toEqual(['carer', 'racer']);
9
10 expect(filterAnagrams('laser', ['lazing', 'lazy', 'lacer'])).toEqual([]);
11
12 ta.assert<ta.Equal<ReturnType<typeof filterAnagrams>, string[]>>();
13});
14
Решение учителя откроется через: