логотип PurpleSchool
Иконка входа
Вход
логотип PurpleSchool

Типы данных в TypeScript

Автор

Вячеслав Руденко

TypeScript - это суперсет JavaScript, что означает, что он расширяет язык JavaScript, добавляя статическую типизацию и другие возможности. Одной из основных особенностей TypeScript являются типы данных.

В typescript присутсвтуют следующие типы:

  • Number: числовое значение
  • String: строка
  • Boolean: логическое значение true или false
  • Array: массивы
  • Symbol
  • BigInt: Для представления целых чисел больше 2^53 - 1
  • Null и undefined: null и undefined как и в javascript
  • Void
  • Enum
  • Any: произвольный тип
  • Unknown: произвольный тип
  • Never

Зачем нужны типы в TypeScript

Типы в TypeScript играют ключевую роль и приносят несколько важных преимуществ:

  1. Безопасность кода: Одной из главных целей типов в TypeScript является обеспечение безопасности кода. Они позволяют выявлять ошибки на этапе разработки, такие как неправильное использование переменных или вызов функций с неверными аргументами. Это помогает предотвращать множество потенциальных ошибок и улучшает качество программного кода.

  2. Читаемость и документация: Использование типов делает код более читаемым и самодокументирующимся. Когда типы хорошо описаны, они служат своеобразной документацией, помогая разработчикам легче понимать, какие данные ожидаются и какие операции можно выполнять с этими данными.

  3. Интеграция с инструментами разработки: Современные интегрированные среды разработки (IDE), такие как Visual Studio Code, предоставляют поддержку TypeScript, включая автодополнение, подсказки и статический анализ кода. Это существенно улучшает процесс разработки и увеличивает производительность.

  4. Командная разработка: Использование типов сильно облегчает командную разработку. Определенные типы позволяют установить четкие соглашения о структуре данных и интерфейсах, что снижает вероятность ошибок при совместной работе над проектом.

  5. Легкий рефакторинг: С помощью типов рефакторинг кода становится более безопасным и предсказуемым. Вы можете вносить изменения в код, зная, что компилятор TypeScript предупредит о возможных проблемах.

  6. Повышение производительности: Благодаря типам TypeScript может лучше оптимизировать код и улучшить производительность приложения.

Таким образом, типы в TypeScript способствуют разработке более надежных, читаемых и поддерживаемых программ, что делает их неотъемлемой частью современной разработки программного обеспечения.

Присвоение типа

Для установки типа применяется знак двоеточия, после которого указывается название типа. Примеры создания переменных:

let num: number = 10;
let hello: string = 'hello world';
let isAdmin: boolean = false;

number

Тип number в TypeScript представляет числовые значения, включая как целые, так и числа с плавающей запятой. Этот тип используется для хранения числовых данных, таких как целые числа, дроби, и числа с плавающей запятой. Например:

const age: number = 30;
const price: number = 299.9;

Тип number позволяет выполнять математические операции, сравнения и другие манипуляции с числовыми данными в безопасном и предсказуемом способе в TypeScript.

string

Тип string в TypeScript представляет текстовые строки, то есть последовательности символов, такие как слова, фразы и символы. Этот тип используется для хранения и обработки текстовых данных в программе. Например:

const name: string = 'Анна';
const message: string = `Привет, ${name}`;

boolean

Тип boolean в TypeScript представляет логические значения и имеет две возможные опции: true (истина) или false (ложь). Пример использования типа boolean:

let isLogged: boolean = true;
let hasPermission: boolean = false;

Array

Тип Array в TypeScript представляет массивы, то есть упорядоченные списки элементов. Массивы могут содержать элементы одного и того же типа данных или различные типы данных. Этот тип используется для хранения коллекций данных и упрощения доступа к элементам массива. Пример использования типа Array:

const numbers: number[] = [1, 2, 3, 4, 5];
const colors: string[] = ['красный', 'синий', 'зеленый'];

Для более сложных случаев, когда вы хотите определить типы элементов массива более подробно, вы можете использовать обобщенные типы. Например:

const users: Array<{id: number; name: string}> = [
  {id: 1, name: 'Анна'},
  {id: 2, name: 'Петр'},
  {id: 3, name: 'Иван'},
];

Symbol

Тип Symbol в TypeScript представляет уникальные и неизменяемые значения, которые используются для создания уникальных идентификаторов и свойств объектов. Каждое значение типа Symbol уникально и не может быть равным другому Symbol.

Пример использования типа Symbol:

// Создаем уникальные символы для идентификации свойств объекта
const key_1: unique symbol = Symbol('Уникальный ключ 1');
const key_2: unique symbol = Symbol('Уникальный ключ 2');

// Создаем объект с использованием символов в качестве ключей
const user = {
  [key_1]: 'John',
  [key_2]: 30,
};

// Доступ к значениям по уникальным ключам
console.log(user[key_1]); // "John"
console.log(user[key_2]); // 30

null и undefined

Как и в JavaScript, в TypeScript есть специальные типы undefined и null, которые принимают соответствующие значения undefined и null. Типы null и undefined в TypeScript представляют отсутствие значения или значение, которое не было присвоено переменной. Они могут быть использованы для обозначения "пустоты" или неопределенности в данных.

  • null представляет явное отсутствие значения и обычно используется, когда значение переменной специально установлено в "ничто" или "пусто".
  • undefined указывает на то, что переменной не было присвоено значения, и она не инициализирована.

Пример:

TODO: подумать над нормальным примером

let unassignedVariable: undefined = undefined;
let emptyVariable: null = null;

void

Тип void в TypeScript используется для указания на отсутствие значения или возвращаемого результата функции. Он часто применяется к функциям, которые не возвращают какое-либо значение, или к переменным, которые не имеют определенного значения.

Пример использования void для функции:

function sayHi(): void {
  console.log('Привет, мир!');
}

В этом примере функция sayHi не возвращает никакого значения (void). Это может быть полезно, например, при выполнении каких-то действий, не требующих возвращения конкретного результата.

Тип void также применяется к переменным, которые не имеют определенного значения:

let nothing: void = undefined; // или можно присвоить null

Важно отметить, что переменным типа void можно присваивать только undefined или null, что отражает отсутствие конкретного значения.

Использование void помогает явно указать, что функция не возвращает значения, или что переменная не имеет определенного значения, что может улучшить читаемость и понимание кода.

enum

Тип enum (перечисление) в TypeScript представляет собой специальный тип данных, который позволяет создавать именованные наборы числовых констант. Эти имена обеспечивают читаемость кода, делают его более понятным и облегчают работу с ограниченным набором значений. Определение enum выглядит следующим образом:

enum elements {
  element1,
  element2,
  // ...
}

Мы так же можем сами установить последовательность:

enum DaysOfWeek {
  Monday = 1, // меняем на 1
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
}
console.log(DaysOfWeek.Monday); // 1
console.log(DaysOfWeek.Friday); // 5

Перечисления также могут содержать строки или быть инициализированы значениями:

enum Result {
  SUCCESS = 'SUCCESS',
  ERROR = 'ERROR',
}
console.log(Result.success); // SUCCESS

Это обеспечивает более явное представление значений перечисления и повышает читаемость кода. Примеры использования enum в TypeScript могут включать различные сценарии, такие как представление константных значений, упрощение кода и улучшение его читаемости. Вот несколько реальных примеров:

enum StatusOrder {
  NEW,
  PROCESSING,
  FULFILLED,
  CANCELED,
}

let currentStatus: StatusOrder = StatusOrder.NEW;
console.log(currentStatus); // 0
enum TypeMedia {
  Image,
  Video,
  Audio,
}

function playMedia(type: TypeMedia): void {
  switch (type) {
    case TypeMedia.Video:
      console.log('Отображение изображения');
      // Логика для отображения изображения
      break;
    case TypeMedia.Video:
      console.log('Воспроизведение видео');
      // Логика для воспроизведения видео
      break;
    case TypeMedia.Audio:
      console.log('Воспроизведение аудио');
      // Логика для воспроизведения аудио
      break;
    default:
      console.log(`Неизвестный тип медиафайла: ${медиафайл.тип}`);
  }
}

playMedia(TypeMedia.Video); // Воспроизведение видео

Этот пример может использоваться в мультимедийных приложениях для различения между типами медиафайлов и выполнения соответствующих действий.

BigInt

Тип BigInt в TypeScript представляет целые числа произвольной длины, которые могут быть очень большими. В отличие от типа number, который имеет ограничение на размер числа, тип BigInt не имеет таких ограничений и может представлять очень большие или очень маленькие целые числа без потери точности.

Пример использования типа BigInt:

const veryBigNumber: bigint = BigInt(100);
const veryBigNumber2: bigint = 1234567890123456789012345678901234567890n;

any

Тип any в TypeScript представляет собой динамический тип данных, который может представлять любое значение. Использование any позволяет присваивать переменным значения различных типов и выполнять разнообразные операции без проверок типов компилятора. Однако, это также означает потерю преимуществ статической типизации, поскольку TypeScript не будет предупреждать о возможных ошибках в процессе компиляции для переменных типа any.

Пример использования:

let undefinedVariable: `any` = 10;
undefinedVariable = 'Привет, мир!';
undefinedVariable = true;

Хотя использование any предоставляет гибкость, рекомендуется избегать его в большинстве случаев, поскольку это может снизить надежность и читаемость кода. Предпочтительнее использовать явные типы данных, чтобы TypeScript мог обеспечивать статическую проверку и предупреждения о возможных ошибках.

unknown

Тип any (любой) — это тип в TypeScript, подходящий к чему угодно. Поскольку он охватывает типы всех возможных значений, то не заставляет нас делать какие-либо проверки, прежде чем мы попытаемся эти значения вызывать, конструировать или получать доступ к их свойствам.

Главное отличие unknown от any связано с проверкой типов. unknown запрещает выполнять любые операции:

let message: unknown = '    пользователь не зарегистрирован';
message.trimStart(); //'message' is of type 'unknown'
message.toUpperCase(); // 'message' is of type 'unknown'

Тип unknown можно использовать для значения, возвращаемого из сетевого вызова:

let response: unknown = getSomeValueFromSomeWhere();

if (typeof response === 'string') {
  //данные — строка
} else if (Array.isArray(response)) {
  //данные — массив
} else if (typeof response === 'object') {
  //данные — объект
}

never

Тип never в TypeScript представляет собой тип, который указывает на ситуацию, в которой функция не завершает выполнение или выражение не возвращает никакого значения. Этот тип обычно используется для функций, которые генерируют ошибки, бесконечных циклов или других сценариев, при которых выполнение программы невозможно завершить нормально.

function throwError(message: string): never {
  throw new Error(message);
}

function infiniteCycle(): never {
  while (true) {
    // Бесконечный цикл
  }
}

Мы рассмотрели основные типы данных.:

  • Number
  • String
  • Boolean
  • Array
  • Symbol
  • BigInt
  • Null
  • Void
  • Enum
  • Any
  • Unknown
  • Never

Каждый из этих типов играет свою роль в обеспечении точности и ясности кода в зависимости от сценариев использования. Использование типов данных в TypeScript не только повышает безопасность кода, но и улучшает производительность разработчика, предоставляя богатый набор инструментов для автодополнения, подсказок и статического анализа в современных интегрированных средах разработки.

В целом, освоение типов данных в TypeScript помогает создавать более надежные, читаемые и поддерживаемые программы, сокращая время разработки и предоставляя разработчикам уверенность в качестве своего кода.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile