**Массивы
Массивы - это упорядоченная коллекция элементов одного или разных типов данных. Массивы в TypeScript могут быть объявлены с использованием синтаксиса типа “тип[]”, где “тип” - это тип элементов массива.
Например:
let numbers: number[] = [1, 2, 3];
let strings: string[] = ["hello", "world"];
let mixed: (number | string)[] = [1, "hello", 2, "world"];
Здесь мы объявляем три массива: массив чисел numbers
, массив строк strings
и массив, содержащий элементы типа number
и string
- mixed
. Обратите внимание, что в массиве mixed
мы используем оператор |
для указания нескольких типов элементов.
Кроме того, в TypeScript есть тип данных Array<T>
, который может быть использован для объявления массива любого типа. Например:
let numbers: Array<number> = [1, 2, 3];
let strings: Array<string> = ["hello", "world"];
let mixed: Array<number | string> = [1, "hello", 2, "world"];
Здесь мы используем тип Array<T>
вместо “тип[]“.
Массивы в TypeScript также поддерживают ряд встроенных методов, таких как push
, pop
, shift
, unshift
, slice
и другие, которые позволяют добавлять, удалять и изменять элементы массива. Кроме того, TypeScript позволяет использовать обобщенные типы для массивов, такие как ReadonlyArray<T>
и ArrayLike<T>
, что расширяет возможности работы с массивами.
**Tuples
Tuples
(кортежи) - это особый тип данных, который позволяет определить массив фиксированной длины и фиксированных типов элементов в определенном порядке.
Кортежи объявляются с помощью квадратных скобок и типов элементов, разделенных запятыми. Например:
let tuple: [number, string, boolean] = [42, "hello", true];
Здесь мы объявляем кортеж tuple
, который содержит три элемента: число, строку и булево значение, в указанном порядке.
Как и массивы, кортежи поддерживают индексацию и операции добавления, удаления и изменения элементов. Однако, в отличие от массивов, кортежи имеют фиксированную длину и типы элементов, что делает их более строгими в использовании.
Например, при попытке присвоить кортежу новое значение, содержащее элементы других типов или несоответствующее длине кортежа, TypeScript выдаст ошибку:
let tuple: [number, string, boolean] = [42, "hello", true];
tuple = [1, "world"]; // Ошибка! Кортеж должен содержать три элемента.
tuple = [42, true, "hello"]; // Ошибка! Нарушен порядок типов элементов.
Кортежи в TypeScript могут быть использованы для представления данных, которые имеют фиксированный формат и порядок, например, для представления координат, даты и времени, или для передачи параметров функции в определенном порядке.
**Объекты
Объекты
- это структуры данных, которые могут содержать набор свойств с определенными именами и типами значений. Объекты в TypeScript могут быть созданы с помощью литералов объектов или конструкторов объектов.
Литерал объекта представляет собой список пар “имя: значение” в фигурных скобках. Например:
let person = { name: "John", age: 30 };
Здесь мы создаем объект person
, который содержит два свойства: name
со значением “John” и age
со значением 30.
Конструктор объекта позволяет создавать объекты с помощью функций-конструкторов или классов. Например:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
let person = new Person("John", 30);
Здесь мы создаем объект person
, используя конструктор класса Person
. Объект person
содержит два свойства: name
со значением “John” и age
со значением 30.
Объекты в TypeScript также могут содержать методы, которые являются функциями, связанными с объектом. Методы могут быть объявлены в литералах объектов или внутри классов. Например:
let person = {
name: "John",
age: 30,
greet() {
console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}
};
person.greet(); // Вывод: "Hello, my name is John and I'm 30 years old."
Здесь мы добавляем метод greet
к объекту person
, который выводит приветствие, содержащее имя и возраст объекта.
Объекты могут быть использованы для представления различных структур данных, таких как пользователи, продукты, заказы и многое другое. TypeScript позволяет определять типы свойств объекта и проверять их во время компиляции кода, что повышает надежность программного обеспечения.
**Map
Map
- это структура данных, которая представляет собой коллекцию пар “ключ-значение”.
Каждый ключ может быть уникальным, и для каждого ключа может быть связано только одно значение. Ключи и значения могут иметь любой тип данных в TypeScript.
Map может быть создана с помощью конструктора Map
.
Например:
let map = new Map<string, number>();
map.set("one", 1);
map.set("two", 2);
map.set("three", 3);
Здесь мы создаем Map, который содержит три пары “ключ-значение”, где ключи имеют тип string
, а значения - тип number
.
Map в TypeScript поддерживает следующие методы:
set(key: K, value: V): this
- добавляет новую пару “ключ-значение” в карту.get(key: K): V | undefined
- возвращает значение, связанное с указанным ключом, илиundefined
, если ключ не найден.has(key: K): boolean
- проверяет, существует ли ключ в карте.delete(key: K): boolean
- удаляет пару “ключ-значение” с указанным ключом из карты и возвращаетtrue
, если удаление произошло успешно, илиfalse
, если ключ не был найден в карте.clear(): void
- удаляет все пары “ключ-значение” из карты.size: number
- свойство, которое возвращает количество пар “ключ-значение” в карте.
Например, мы можем использовать метод get
для получения значения, связанного с определенным ключом:
let map = new Map<string, number>();
map.set("one", 1);
map.set("two", 2);
map.set("three", 3);
console.log(map.get("two")); // Вывод: 2
Map в TypeScript также поддерживает итерацию по парам “ключ-значение” с помощью метода forEach
или с помощью цикла for..of
. Например:
let map = new Map<string, number>();
map.set("one", 1);
map.set("two", 2);
map.set("three", 3);
map.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// Вывод:
// one: 1
// two: 2
// three: 3
for (let [key, value] of map) {
console.log(`${key}: ${value}`);
}
// Вывод:
// one: 1
// two: 2
// three: 3
Map в TypeScript может быть использована для различных задач, например, для хранения пар “ключ-значение” настроек, кэширования результатов вычислений и других сценариев.
**Set
Set
(множество) - это структура данных, которая представляет собой коллекцию уникальных значений любого типа данных.
Set в TypeScript может быть создан с помощью конструктора Set
. Например:
let set = new Set<number>();
set.add(1);
set.add(2);
set.add(3);
Здесь мы создаем Set, который содержит три уникальных числовых значения.
Set в TypeScript поддерживает следующие методы:
add(value: T): this
- добавляет новый элемент в множество.delete(value: T): boolean
- удаляет указанный элемент из множества и возвращаетtrue
, если удаление произошло успешно, илиfalse
, если элемент не был найден в множестве.has(value: T): boolean
- проверяет, содержится ли указанный элемент в множестве.clear(): void
- удаляет все элементы из множества.size: number
- свойство, которое возвращает количество элементов в множестве.
Например, мы можем использовать метод has
для проверки, содержится ли элемент в множестве:
let set = new Set<number>();
set.add(1);
set.add(2);
set.add(3);
console.log(set.has(2)); // Вывод: true
console.log(set.has(4)); // Вывод: false
Set в TypeScript также поддерживает итерацию по элементам с помощью метода forEach
или с помощью цикла for..of
. Например:
let set = new Set<number>();
set.add(1);
set.add(2);
set.add(3);
set.forEach(value => {
console.log(value);
});
// Вывод:
// 1
// 2
// 3
for (let value of set) {
console.log(value);
}
// Вывод:
// 1
// 2
// 3
Set в TypeScript может быть использован для хранения уникальных значений, например, для удаления дубликатов из массива или для хранения списка уникальных идентификаторов.
**WeakMap и WeakSet
**WeakMap
WeakMap (слабая карта)
- это структура данных, которая представляет собой коллекцию пар “ключ-значение”, где ключами могут быть только объекты, а значения могут быть любого типа данных.
WeakMap подобна Map, но имеет ряд отличий. Главным отличием является то, что ключи WeakMap являются слабыми (weak), это означает, что если объект, являющийся ключом, больше не используется в программе, то он может быть автоматически удален из WeakMap в процессе сборки мусора.
WeakMap может быть создан с помощью конструктора WeakMap
, который принимает объект в качестве аргумента, содержащего пары “ключ-значение”. Например:
let key1 = {};
let key2 = {};
let weakMap = new WeakMap([[key1, "value1"], [key2, "value2"]]);
Здесь мы создаем WeakMap, который содержит две пары “ключ-значение”, где ключами являются объекты key1
и key2
, а значениями - строки “value1” и “value2”.
WeakMap поддерживает следующие методы:
get(key: K): V | undefined
- возвращает значение, связанное с указанным ключом, илиundefined
, если ключ не найден.set(key: K, value: V): this
- связывает указанное значение с указанным ключом в WeakMap.has(key: K): boolean
- проверяет, существует ли ключ в WeakMap.delete(key: K): boolean
- удаляет пару “ключ-значение” с указанным ключом из WeakMap и возвращаетtrue
, если удаление произошло успешно, илиfalse
, если ключ не был найден в WeakMap.
WeakMap не поддерживает методы size
и forEach
, так как они не могут гарантировать, что все ключи будут доступны на момент вызова.
WeakMap может быть использован для хранения приватных данных, связанных с определенным объектом, таких как кэшированные результаты вычислений. Кроме того, WeakMap может быть использован для предотвращения утечек памяти, связанных с хранением большого количества объектов, которые больше не используются в программе.
**WeakSet
WeakSet (слабое множество)
- это структура данных, которая представляет собой коллекцию уникальных объектов.
WeakSet подобна Set, но имеет ряд отличий. Главным отличием является то, что элементы WeakSet являются слабыми (weak), это означает, что если объект больше не используется в программе, то он может быть автоматически удален из WeakSet в процессе сборки мусора.
WeakSet может быть создан с помощью конструктора WeakSet
, который принимает объекты в качестве аргументов. Например:
let obj1 = {};
let obj2 = {};
let weakSet = new WeakSet([obj1, obj2]);
Здесь мы создаем WeakSet, который содержит два объекта obj1
и obj2
.
WeakSet поддерживает следующие методы:
add(value: T): this
- добавляет новый элемент в WeakSet.delete(value: T): boolean
- удаляет указанный элемент из WeakSet и возвращаетtrue
, если удалениепроизошло успешно, илиfalse
, если элемент не был найден в WeakSet.has(value: T): boolean
- проверяет, содержится ли указанный элемент в WeakSet.
Например, мы можем использовать метод has
для проверки, содержится ли объект в WeakSet:
let obj1 = {};
let obj2 = {};
let weakSet = new WeakSet([obj1, obj2]);
console.log(weakSet.has(obj1)); // Вывод: true
console.log(weakSet.has({})); // Вывод: false, так как создается новый объект
WeakSet не поддерживает методы size
и forEach
, так как они не могут гарантировать, что все элементы будут доступны на момент вызова.
WeakSet может быть использован для хранения объектов, которые должны быть автоматически удалены, когда они больше не используются в программе. Например, WeakSet может быть использован для хранения ссылок на объекты, созданные в определенном контексте, таких как компоненты веб-страницы, чтобы они могли быть удалены, когда пользователь покидает страницу.