← Назад к вопросам

Какие есть типы в TS, помимо типов JS?

1.0 Junior🔥 141 комментариев
#JavaScript Core#Браузер и сетевые технологии

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы TypeScript, отсутствующие в "чистом" JavaScript

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

1. Типы, связанные с Объектами и Структурами

Интерфейсы (Interfaces)

Интерфейсы определяют контракт формы объекта. Они поддерживают наследование (extends) и объединение деклараций.

interface User {
  id: number;
  name: string;
  email?: string; // Необязательное свойство
}

interface Admin extends User {
  permissions: string[];
}

Типы Пересечений (Intersection Types)

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

type Serializable = { serialize(): string };
type Identifiable = { id: number };

type Entity = Serializable & Identifiable;
// Entity должен иметь и id, и метод serialize

2. Продвинутые Примитивные и Псевдонимы Типов

Литеральные Типы (Literal Types)

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

type Direction = 'north' | 'south' | 'east' | 'west';
type StatusCode = 200 | 404 | 500;
const dir: Direction = 'north'; // Допустимо только одно из 4 значений

Псевдонимы Типов (Type Aliases)

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

type StringOrNumber = string | number;
type Point = [number, number]; // Кортеж

3. Типы для Моделирования null/undefined и Отсутствующих Значений

Типы null и undefined как самостоятельные единицы

В строгом режиме (strictNullChecks) null и undefined являются отдельными типами, не совместимыми с другими.

let value: string | null = null; // Явное указание на возможность null

4. Типы, Основанные на Условной Логике и Шаблонах

Условные Типы (Conditional Types)

Позволяют выбирать тип на основе условия в форме T extends U ? X : Y. Ключевой инструмент для создания дженериков (обобщённых типов) высшего порядка.

type NonNullable<T> = T extends null | undefined ? never : T;
// Если T расширяет null или undefined, вернёт never, иначе сам T
type Result = NonNullable<string | null>; // Результирующий тип: string

Сопоставляемые Типы (Mapped Types)

Позволяют создавать новые типы на основе старых, трансформируя их свойства.

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};
// Делает все свойства типа T доступными только для чтения

Шаблонные Литеральные Типы (Template Literal Types)

Используют синтаксис шаблонных строк для создания новых строковых литеральных типов.

type EventName = 'click' | 'scroll';
type HandlerName = `on${Capitalize<EventName>}`;
// Результирующий тип: "onClick" | "onScroll"

5. Служебные (Утилитарные) Типы (Utility Types)

TypeScript предоставляет встроенные дженерики для распространённых преобразований типов.

  • Partial<T>: делает все свойства T необязательными.
  • Required<T>: делает все свойства T обязательными.
  • Readonly<T>: делает все свойства T доступными только для чтения.
  • Record<K, T>: создаёт тип объекта с ключами типа K и значениями типа T.
  • Pick<T, K>: создаёт тип, выбрав из T только набор свойств K.
  • Omit<T, K>: создаёт тип, исключив из T набор свойств K.
  • ReturnType<T>: извлекает тип возвращаемого значения функции T.
  • Parameters<T>: извлекает тип кортежа параметров функции T.
interface User {
  name: string;
  age: number;
}

type UserPreview = Pick<User, 'name'>; // { name: string }
type UserPartial = Partial<User>; // { name?: string; age?: number; }

6. Специальные Типы

Тип any

Отключает проверку типов для значения. Следует избегать в пользу более строгих альтернатив.

Тип unknown

Более безопасная альтернатива any. Значение типа unknown нельзя использовать, не сузив его тип (с помощью type guards).

let data: unknown = fetchData();
if (typeof data === 'string') {
  console.log(data.toUpperCase()); // Теперь безопасно
}

Тип never

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

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

Тип void

Указывает на отсутствие возвращаемого значения у функции (в отличие от undefined как типа возврата).

Заключение

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

  • Выражать сложные ограничения данных (литеральные, пересечения).
  • Создавать гибкие и переиспользуемые абстракции (дженерики, условные и сопоставляемые типы).
  • Извлекать и преобразовывать типы из существующих деклараций (утилитарные типы).
  • Моделировать состояния программы более точно (unknown, never).

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

Какие есть типы в TS, помимо типов JS? | PrepBro