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

JavaScript изначально был разработан как простой язык сценариев. Его свободная природа и отсутствие основных объектно-ориентированных программных функций создают определенные проблемы для разработчиков:

  1. Ограниченная документация и автоматическое завершение.

  2. Невозможность использовать концепции ООП.

  3. Отсутствие безопасности типов, что приводит к ошибкам во время выполнения.

  4. Проблемы с рефакторингом и поддержкой.

  5. Отсутствие интерфейсов и точек интеграции.

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

В этой статье мы рассмотрим основы TypeScript. Я научу вас, как установить TS и настроить проект. Затем мы обсудим некоторые важные основы. Вы также узнаете, как TypeScript компилируется в JavaScript, что делает его совместимым с браузерами и окружениями Node.js.

Что мы рассмотрим:

Предварительные требования

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

1. Основы JavaScript

TypeScript является надмножеством JavaScript, что означает, что он расширяет возможности JavaScript. Чтобы эффективно изучать TypeScript, вам следует сначала хорошо понимать основы JavaScript, включая:

  • Синтаксис и типы данных: Понимание объявления переменных (let, const и var), работу с примитивными типами (строки, числа, логические значения) и управление массивами и объектами.

  • Управление потоком выполнения: Быть знакомым с циклами (for, while), условными операторами (if-else, switch) и тем, как они управляют выполнением программы.

  • Функции: Знайте, как определять и вызывать функции, работать с параметрами, возвращаемыми значениями, и понимать концепции стрелочных функций и замыканий.

  • Объектно-ориентированное программирование (ООП): Изучите создание и работу с объектами, классами и наследованием. Классовые функции TypeScript тесно связаны с ООП моделью JavaScript.

  • Обработка ошибок: Понимайте, как использовать блоки try-catch для обработки ошибок во время выполнения.

2. Основы HTML и CSS

Хотя TypeScript — это язык, в основном используемый с JavaScript, иметь базовое понимание HTML и CSS полезно, особенно для разработчиков фронт-энда. Это потому, что большинство проектов на TypeScript включают создание или работу с веб-приложениями

  • HTML: Понимайте, как структурировать веб-страницы с помощью тегов, атрибутов и элементов.

  • CSS: Узнайте, как стилизовать элементы с помощью селекторов, свойств и значений. Знание CSS-фреймворков, таких как Bootstrap, будет плюсом.

3. Знание инструментов разработки

  • Редактор кода такой как Visual Studio Code, который имеет отличную поддержку TypeScript и расширения.

  • Node.js и npm: Поймите, как настроить среду разработки, запускать JavaScript вне браузера и использовать npm (Node Package Manager) для установки зависимостей.

  • Управление версиями (Git): Изучите основы Git, чтобы отслеживать изменения и эффективно сотрудничать в проектах на TypeScript.

Начало работы — Как установить TypeScript

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

Вы можете установить TS двумя способами:

  1. Глобальная установка: позволяет вам получать доступ к компилятору из любой директории на вашем компьютере. Чтобы установить TypeScript глобально, выполните следующую команду:
npm install -g typescript

Эта команда использует менеджер пакетов Node.js, npm. Она устанавливает TypeScript глобально, делая команду доступной в командной строке.

  1. Локальная установка: в этом случае TypeScript устанавливается только в рамках конкретного проекта. Этот метод обеспечивает совместимость версий и согласованность среди членов команды. Чтобы установить TypeScript локально, выполните следующую команду:
npm install typescript --save-dev

В отличие от глобальной установки, эта команда устанавливает TypeScript как зависимость для разработки. Команда tsc доступна только для использования в конкретном проекте, то есть в том проекте, где вы выполняете команду.

Можете ли вы теперь без проблем установить TypeScript? Я надеюсь, что да!

Как организовать ваши проекты TypeScript

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

Расширение .ts обозначает файлы TypeScript и содержит код, который преобразуется в JavaScript для выполнения.

TypeScript также поддерживает .d.ts файлы, также известные как файлы определения типов. Эти файлы предлагают информацию о типах внешних библиотек или модулей JavaScript, что помогает улучшить проверку типов и автозаполнение кода, а также повысить эффективность разработки. Ниже приведен пример хорошей структуры проекта TS:

my-ts-project/
├── src/ 
│   ├── components/ 
│   │   ├── Button.tsx
│   │   ├── Input.tsx
│   │   └── Modal.tsx
│   ├── services/ 
│   │   ├── api.ts
│   │   └── authService.ts
│   ├── utils/ 
│   │   ├── helpers.ts 
│   │   └── validators.ts
│   ├── models/ 
│   │   ├── User.ts
│   │   └── Product.ts
│   ├── index.tsx 
│   └── styles/ 
│       ├── global.css
│       └── theme.css
├── public/ 
│   ├── index.html
│   └── assets/ 
│       ├── images/
│       └── fonts/
├── tsconfig.json
└── package.json

Давайте разберемся, что здесь происходит:

  1. src/: Этот каталог содержит весь исходный код проекта.

    • components/: Содержит переиспользуемые компоненты пользовательского интерфейса (например, Button, Input, Modal). Использование .tsx (TypeScript JSX) позволяет писать JSX с типобезопасностью.

    • services/: Содержит сервисы, которые взаимодействуют с внешними API или обрабатывают логику приложения (например, api.ts для вызовов API, authService.ts для аутентификации).

    • utils/: Содержит вспомогательные функции и утилитарные классы для общих задач (например, helpers.ts для форматирования дат, validators.ts для валидации ввода).

    • models/: Определяет интерфейсы или классы TypeScript для представления структур данных (например, User.ts, Product.ts).

    • index.tsx: Главная точка входа в приложение.

    • styles/: Содержит файлы стилей CSS или другие файлы оформления.

  2. public/: Этот каталог содержит статические ресурсы, которые не обрабатываются TypeScript (например, HTML, изображения, шрифты).

  3. tsconfig.json: Файл конфигурации TypeScript, определяющий параметры компилятора.

  4. package.json: Манифест проекта, в котором перечислены зависимости, скрипты и другие метаданные проекта.

Небольшое замечание о соглашениях об именовании, чтобы вы их понимали:

  • Используйте PascalCase для названий классов (например, User, Product).

  • Используйте camelCase для названий функций и переменных (например, getUser, firstName).

  • Используйте значимые и описательные названия для файлов и директорий.

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

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

Как работает типизация в TypeScript

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

Типизация – это термин, используемый в программировании для определения типов данных для переменных, параметров методов и возвращаемых значений в коде.

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

Чтобы указать тип в TypeScript, поставьте двоеточие (:) и желаемый тип данных после названия вашей переменной. Вот пример:

let age: number = 2;

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

Техники типизации

В TypeScript данные могут быть типизированы двумя основными способами:

  1. Статическая типизация: Статическая типизация относится к явному указанию типа данных переменных и других сущностей в коде во время разработки. Компилятор TypeScript обеспечивает соблюдение этих определений типов, помогая рано выявлять ошибки, связанные с типами. Например:
let age: number = 25;

Здесь переменная age явно объявлена как тип number. Это гарантирует, что ей могут быть присвоены только числовые значения, что снижает риск ошибок времени выполнения.

  1. Динамическая типизация: Динамическая типизация в TypeScript относится к ситуациям, когда тип переменной определяется во время выполнения. Это может происходить, когда переменным присваивается тип any, что позволяет им содержать значения любого типа. TypeScript не выполняет проверку типов при операциях с переменными типа any.
let value: any;
value = 25; // Число
value = "Hello"; // Строка

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

  • Работа с сторонними библиотеками, не имеющими определений типов.

  • Взаимодействие с динамически структурированными данными (например, ответами JSON от API с неизвестными структурами).

  • Быстрое прототипирование или когда информация о типе недоступна на начальном этапе разработки.

Статическая vs. динамическая типизация в TypeScript

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

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

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

Вывод типа и объединение типов

Вывод типа

Вывод типа – это мощная функция TypeScript, позволяющая компилятору автоматически вывести тип переменной на основе значения, присвоенного ей при инициализации. Проще говоря, TypeScript анализирует значение, которое вы присваиваете переменной, и решает, каким типом она должна быть, даже если вы не объявляете тип явно.

Например:

typescriptCopyEditlet age = 25; // TypeScript выводит, что 'age' имеет тип 'number'
age = "hello"; // Ошибка: тип 'string' не может быть присвоен типу 'number'

В этом примере переменная age автоматически определяется как number из-за своего начального значения 25. Любая попытка переназначить age на значение другого типа (например, строку) приведет к ошибке типа.

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

Когда использовать вывод типов:
  • Простые присваивания: Используйте вывод типов для простых присваиваний, где тип очевиден из значения.

  • Значения по умолчанию: При предоставлении значений по умолчанию для переменных или параметров функций вывод типов гарантирует, что будет применен правильный тип без необходимости в ручных аннотациях.

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

Объединенные типы

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

Например:

typescriptCopyEditlet numOrString: number | string; // 'numOrString' может содержать либо число, либо строку
numOrString = 25; // Верно
numOrString = "hello"; // Верно
numOrString = true; // Ошибка: Тип 'boolean' не может быть присвоен типу 'number | string'

Вы даже можете определить объединенные типы с более чем двумя возможными типами:

typescriptCopyEditlet multiType: number | string | boolean;
multiType = 42; // Верно
multiType = "TypeScript"; // Верно
multiType = false; // Верно
Когда использовать объединенные типы:
  • Гибкие параметры функции: Когда функция может принимать несколько типов входных данных.

      typescriptCopyEditfunction printValue(value: string | number) {
        console.log(value);
      }
    
  • Обработка различных структур данных: Когда работаешь с API или внешними источниками данных, где поля могут различаться по типу.

  • Необязательные или многосостояние переменные: Например, переменная, которая может представлять состояние загрузки как булевое значение, ошибку как строку или корректные данные как объект:

      typescriptCopyEditlet status: boolean | string | { success: boolean; data: any };
    

Как работать с объектами, массивами и типами функций в TypeScript

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

Примитивные типы JavaScript, такие как строки, числа, логические значения и другие, также определяют основные строительные блоки данных в TypeScript. Но в частности, Объекты, Массивы, и Функции необходимы для создания надежных приложений. С помощью объектов, массивов и функций вы можете лучше обрабатывать данные и использовать их эффективно в разработке.

Типы объектов в TypeScript

Типы объектов представляют собой шаблон для создания объектов в TypeScript. Вы можете использовать объекты для определения их формы, аналогично тому, как классы используются в объектно-ориентированном программировании (ООП). Но у объектов отсутствуют поведенческие аспекты и инкапсуляция, которые предлагают классы.

Чтобы определить тип объекта, явно определите шаблон объекта после двоеточия (:). Например:

// Инициализация типа объекта

let student: {
    name: string;
    age: number;
    matricNumber: string | number;
 };

// Присваивание объекту фактических данных

student = {
    name: "Akande"
    age: 21,
    matricNumber: 21/52 + "HP" + 19,
};

Обратите внимание, что свойства заканчиваются точкой с запятой ;, а не запятой ,, которая завершает их в фактическом объекте.

Вышеуказанный способ является основным для определения объекта в TypeScript. Другой способ – использовать интерфейсы, которые я рассмотрю позже в этой статье.

Типы массивов в TypeScript

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

В TypeScript типы массивов можно определить двумя способами:

1. Используя модель Array<type>

Этот синтаксис использует обобщенный тип Array, где type представляет тип элементов, которые может содержать массив.

typescriptCopyEditlet numbers: Array<number> = [1, 2, 3, 4, 5];
let mixedArray: Array<number | string> = [1, 2, 3, 4, 5, "Hello"];
  • numbers Пример: Этот массив может содержать только числа. Попытка добавить строку или другой тип в этот массив приведет к ошибке типа.

      typescriptCopyEditnumbers.push(6); // Верно
      numbers.push("Hello"); // Ошибка: Тип 'string' не может быть присвоен типу 'number'
    
  • mixedArray Пример: Этот массив использует объединенный тип (number | string), что позволяет ему хранить как числа, так и строки.

      typescriptCopyEditmixedArray.push(42); // Допустимо
      mixedArray.push("TypeScript"); // Допустимо
      mixedArray.push(true); // Ошибка: Тип 'boolean' нельзя присвоить типу 'number | string'
    

2. Использование модели type[]

Этот синтаксис добавляет квадратные скобки ([]) к типу элементов, которые могут содержаться в массиве.

typescriptCopyEditconst numbers: number[] = [1, 2, 3, 4, 5];
const mixedArray: (string | number)[] = [1, 2, 3, 4, 5, "Hello"];
  • numbers Пример: Подобно примеру с Array<number>, этот массив может содержать только числа.

      typescriptCopyEditnumbers[0] = 10; // Допустимо
      numbers.push("Привет"); // Ошибка: Тип 'string' нельзя присвоить типу 'number'
    
  • mixedArray Пример: Как и ранее mixedArray, этот массив позволяет использовать как числа, так и строки, обеспечивая гибкость при различных типах данных.

      typescriptCopyEditmixedArray[1] = "World"; // Верно
      mixedArray.push(true); // Ошибка: Тип 'boolean' нельзя присвоить типу 'string | number'
    

Как использовать массивы в TypeScript

Массивы являются универсальными и часто используются для хранения коллекций связанных данных. Вот несколько практических сценариев использования:

Хранение однородных данных:
Когда все элементы в массиве имеют одинаковый тип, например, список идентификаторов пользователей или цен продуктов:

typescriptCopyEditconst userIds: number[] = [101, 102, 103];
const productPrices: Array<number> = [29.99, 49.99, 19.99];

Хранение разнородных данных:
Когда элементы могут иметь разные типы, например, список сообщений, содержащий текст и дополнительные метаданные:

typescriptCopyEditconst messages: (string | object)[] = [
  "Welcome",
  { type: "error", text: "Something went wrong" },
];

Итерация по массивам:
Массивы в TypeScript могут использоваться в циклах с полной типовой безопасностью:

typescriptCopyEditconst scores: number[] = [80, 90, 70];
scores.forEach((score) => console.log(score + 5)); // Добавляет 5 к каждому баллу

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

typescriptCopyEditfunction getNumbers(): number[] {
  return [1, 2, 3];
}
function printStrings(strings: string[]): void {
  strings.forEach((str) => console.log(str));
}

Типы функций в TypeScript

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

function addition (a: number, b: number): number {
return a + b;
}

Приведенная выше функция принимает два числа, складывает их и возвращает число. Функция не будет работать, если какие-либо из ее аргументов не являются числами, и если она возвращает что-то кроме числа. Например:

  1. Вызов функции со строкой в качестве аргумента:
// Это не сработает, потому что она ожидает числа, а один из аргументов - строка

addition(1, "two");
  1. Переписывание функции для возврата строки:
// Функция вернет ошибку, потому что возвращает строку

function addition (a: number, b: number): string {
    let result = a + b;
    let returnStatement = `Addition of ${a} and ${b} is: ${result}`;
    return returnStatement;
}

Попробуйте выполнить код самостоятельно, чтобы увидеть, как работают эти примеры.

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

Как создать пользовательские типы в TypeScript

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

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

Ключевое слово type

Ключевое слово type позволяет вам создавать псевдонимы типов, предоставляя способ создания пользовательских типов. Типы, которые вы создаете, могут быть повторно использованы в вашей кодовой базе. Псевдонимы типов помогают определять объединенные типы или комбинировать типы в один псевдоним. Синтаксис для создания пользовательского типа выглядит следующим образом:

// Синтаксис

type TypeAlias = type;

А вот пример:

Код выше создает пользовательский тип UserName, объединение чисел и строк. Он использует созданный тип для определения двух переменных, чтобы проверить, работает ли тип.

Обратите внимание, что рекомендуется, чтобы псевдоним типа начинался с заглавной буквы.

Ключевое слово type обычно используется для примитивов – но как насчет создания пользовательского объектного типа?

Здесь вступают в дело интерфейсы.

Интерфейсы TypeScript

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

Определение интерфейса

Интерфейс определяется с использованием ключевого слова interface. Синтаксис выглядит следующим образом:

typescriptCopyEditinterface InterfaceName {
  property1: Type;
  property2: Type;
}

Пример:

typescriptCopyEditinterface User {
  id: number;
  name: string;
  email: string;
}

const user: User = {
  id: 1,
  name: "Alice",
  email: "[email protected]",
};

Вот что происходит в этом примере:

  1. Объявление интерфейса (interface User):

    • Здесь мы определяем чертеж для объекта User. Он указывает, что любой объект типа User должен иметь следующие свойства:

      • id типа number

      • name типа string

      • email типа string

  2. Используя интерфейс (const user: User):

    • Мы объявляем объект user типа User.

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

Например:

    typescriptCopyEditconst invalidUser: User = {
      id: 1,
      name: "Alice",
      // Ошибка: Свойство 'электронная почта' отсутствует в типе
    };

Поэтому вы, возможно, задаетесь вопросом – почему следует использовать интерфейсы?

  • Безопасность типов: Обеспечивает соответствие объектов ожидаемой структуре, предотвращая ошибки во время выполнения.

  • Переиспользуемость: Один и тот же интерфейс можно переиспользовать в разных частях приложения, что снижает дублирование.

  • Читаемость кода: Упрощает чтение и понимание кода, явно описывая структуру объектов.

Расширенные функции интерфейсов

  1. Необязательные свойства: Вы можете сделать свойства необязательными, добавив вопросительный знак (?).

     typescriptCopyEditinterface Product {
       id: number;
       name: string;
       description?: string; // Необязательное свойство
     }
    
     const product: Product = {
       id: 101,
       name: "Ноутбук",
     }; // Действительно, так как 'description' является необязательным
    
  2. Свойства только для чтения: Используйте readonly, чтобы предотвратить изменение свойств после инициализации.

     typescriptCopyEditinterface Point {
       readonly x: number;
       readonly y: number;
     }
    
     const point: Point = { x: 10, y: 20 };
     point.x = 15; // Ошибка: Невозможно присвоить 'x', так как это свойство только для чтения
    
  3. Расширение интерфейсов: Интерфейсы могут наследовать свойства от других интерфейсов, обеспечивая композицию.

     typescriptCopyEditinterface Человек {
       имя: строка;
       возраст: число;
     }
    
     interface Сотрудник расширяет Человек {
       идентификаторСотрудника: число;
     }
    
     const сотрудник: Сотрудник = {
       имя: "Джон",
       возраст: 30,
       идентификаторСотрудника: 1234,
     };
    

Когда использовать интерфейсы

Существуют различные сценарии, когда целесообразно использовать интерфейсы. Вы можете использовать их, когда хотите определить и обеспечить структуру объектов, передаваемых в вашем коде.

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

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

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

Обобщения и литеральные типы

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

Вот пример обобщенной функции и обобщенного интерфейса в TypeScript:

// Обобщенный интерфейс для коробки, которая может содержать любое значение 

interface  Box<T> { 
    value: T; 
}

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

let  numberBox: Box<number> = { value: 10 };
let  stringBox: Box<string> = { value: "TypeScript" };

console.log(numberBox.value); // Вывод: 10  
console.log(stringBox.value); // Вывод: TypeScript

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

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

type Direction = 'up' | 'down' | 'left' | 'right';

Переменной, созданной с указанным типом, можно присвоить только строки up, down, left и right.

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

Как объединить типы в TypeScript

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

1. Объединение объявлений в интерфейсах

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

Пример:
typescriptCopyEditinterface User {
  id: number;
  name: string;
}

interface User {
  email: string;
}

const user: User = {
  id: 1,
  name: "Alice",
  email: "[email protected]",
};
Как это работает:
  • Интерфейс User объявлен дважды, каждый раз с различными свойствами.

  • Тайпскрипт автоматически объединяет эти объявления в один интерфейс:

      typescriptCopyEditinterface Пользователь {
        id: number;
        name: string;
        email: string;
      }
    
  • При создании объекта user все свойства объединенного интерфейса должны присутствовать. Если какое-либо свойство отсутствует, Тайпскрипт выдаст ошибку.

Объединение объявлений особенно полезно при работе с сторонними библиотеками. Вы можете расширить или добавить новые свойства к существующему интерфейсу без изменения исходного кода библиотеки.

2. Объединение интерфейсов с использованием ключевого слова extends

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

Пример:
typescriptCopyEditinterface Person {
  name: string;
  age: number;
}

interface Employee extends Person {
  employeeId: number;
}

const employee: Employee = {
  name: "John",
  age: 30,
  employeeId: 101,
};
Как это работает:
  • Интерфейс Person определяет два свойства: name и age.

  • Интерфейс Employee использует ключевое слово extends, чтобы наследовать свойства от Person.

  • Интерфейс Employee также добавляет новое свойство, employeeId.

  • Объект employee должен включать все свойства как из Person, так и из Employee.

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

3. Слияние типов с помощью & оператора

Оператор &, известный как тип пересечения, позволяет вам комбинировать несколько типов в один тип. Результирующий тип включает все свойства и методы из каждого типа.

Пример:
typescriptCopyEdittype Address = {
  city: string;
  country: string;
};

type ContactInfo = {
  email: string;
  phone: string;
};

type EmployeeDetails = Address & ContactInfo;

const employee: EmployeeDetails = {
  city: "New York",
  country: "USA",
  email: "[email protected]",
  phone: "123-456-7890",
};
Как это работает:
  • Address и ContactInfo — это два отдельных типа.

  • ДеталиСотрудника — это пересеченный тип, созданный с использованием Адрес & КонтактнаяИнформация.

  • Объект сотрудник должен включать все свойства как из Адрес, так и из КонтактнаяИнформация. Отсутствующие или неправильно типизированные свойства приведут к ошибке TypeScript.

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

Когда использовать каждый из этих подходов

  1. Слияние деклараций: Используйте, когда хотите расширить или дополнить существующий интерфейс, особенно в библиотеках сторонних производителей или общих кодовых базах.

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

  3. Типы пересечения (&): Используйте, когда вам нужно объединить несколько несвязанных типов в один для конкретных случаев использования.

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

Упаковка и преобразования в TypeScript

Не каждый браузер поддерживает последний JavaScript, используемый TypeScript. Поэтому вы можете использовать компилятор TypeScript, или tsc, для преобразования кода TypeScript (.ts файлы) в обычный JavaScript (.js файлы), который совместим со всеми браузерами. tsc преобразует специфические для TypeScript элементы, такие как типы и классы, в код JavaScript, который браузеры могут интерпретировать.

Для выполнения файлов TypeScript вашим лучшим инструментом является tsc. Вы можете установить tsc с помощью npm, а затем преобразовать ваши .ts файлы в .js файлы. Чтобы использовать tsc, просто укажите имя файла TypeScript перед командой tsc. Например, если у вас есть файл с именем app.ts, вы можете запустить его, набрав:

tsc app.ts

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

Постройте лучший код с TypeScript

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

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

Продолжайте расширять свои границы и погружайтесь глубже в мир TypeScript. 😉