Какие есть типы в TS, помимо типов JS?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы 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 выразительной и структурной, позволяя ловить ошибки на этапе компиляции и служа качественной документацией для кода.