Заметки о просмотре «Использование массивов и коллекций в Typescript 5» от Pluralsight.

Зачем использовать машинописный текст? — Более полный контроль над нашим кодом благодаря надежным типам данных.

О программе? — работа со строго типизированными массивами, наборами, кортежами и картами.



Массивы

набор элементов

[ 'cow', 'horse', 'pig', 'chicken' ]

indexes:
  0 or -4 = 'cow'
  1 or -3 = 'horse'
  2 or -2 = 'pig'
  3 or -1 = 'chicken'

** careful when using negative indexes
const observations: number[] = [3, 6];

— добавление

// add to end
observations.push(7); // [3, 6, 7]
// add to start
observations.unshift(1, 2); // [1, 2, 3, 6, 7]
// add to location
observations.slice(3, 0, 4, 5); // [1, 2, 3, 4, 5, 6, 7]

— удаление

// remove from end
observations.pop(); // [1, 2, 3, 4, 5, 6]
// remove from start
observations.shift(); // [2, 3, 4, 5, 6]
observations.shift(); // [3, 4, 5, 6]
// remove from location
observations.slice(1, 2); // [3, 6]

— объединение

const combined = [2, 3].concat([4, 5], [6, 7]); // [2, 3, 4, 5, 6, 7]

— подмножество

// slice from the end
[1, 2, 3, 4, 5].slice(-2); // [4, 5]

// slice from location
[1, 2, 3, 4, 5].slice(2, 4); // [3, 4]

— скопировать

const copy1 = observations.concat();
const copy2 = observations.slice();
const copy3 = [...observations];

— сортировать/индексировать/включать

['b', 'a', 'c'].sort(); // ['a', 'b', 'c']
['b', 'a', 'c'].reverse(); // ['c', 'a', 'b'], no sort

['a', 'b', 'c'].indexOf('a'); // 0
['a', 'b', 'c'].indexOf('z'); // -1, not found

['a', 'a', 'b'].lastIndexOf('a'); // 1

['a', 'b', 'c'].includes('a'); // true
['a', 'b', 'c'].includes('a', 1); // false
  • toSorted , toReverse : доступно в Chrome

— карта/фильтр

[1, 2, 3].map((item: number) => number + 1); // [2, 3, 4]
[1, 2, 3].filter((item: number) => number > 1); // [2, 3]
  • цепные методы вместе

— это массив?

Array.isArray([1, 2, 3]); // true
Array.isArray('abc'); // false

— циклы

for (let index: number = 0; i < observations.length; ++index)
for (let index: number in observations)
for (const item of observations)

Кортежи

  • каждый элемент строго типизирован
  • конечное число элементов
  • readonly для ограничения использования метода массива
type GameType = [string, number, string?];

const pong: readonly GameType = ['Pong', 1972];

const games: GameType[] = [
  pong.slice(),
  ["The Oregon Trail", 1981, "MS DOS"],
]

// nested tuples
type Player = [string, GameType];

const bob: Player = ["bob", games[1]];

// deconstruct
const [, year, os] = games[1];

Наборы

способ хранения различных значений данных

const items = new Set<string>(['a', 'a', 'b', 'c']); // { 'a', 'b', 'c' }

items.add('d'); // { 'a', 'b', 'c', 'd' }

// is something in the set?
items.has('a'); // true

// remove entry?
items.delete('a'); // { 'b', 'c', 'd' }

// how many items?
items.size;

// clear set
items.clear(); // { }

// looping
for (const item of new Set<string>(['a', 'b', 'c'])) { }
  • .size !!! вместо длины
  • for / in плохо… нет понятия индекса, нет определенного порядка

Карты

способ хранения пар ключ/значение, ключи упорядочены вставкой и имеют свойство размера

const observations = new Map<string, number>([
  ['Tetris', 40],
  ['Pong', 30],
]);

observations.set('Oregon Trail', 20);

// get data?
observations.get('Tetris'); // return type: (number | undefined)

// has data?
observations.has('Tetris'); // true

// remove?
observations.delete('Tetris');

// how many?
observations.size;

// clear?
observations.clear();

// looping
for (const [key, value] of observations) { }
  • .size !!! вместо длины

Карта против записи