В TypeScript существует два основных способа описания формы объекта: interface и type. Хотя во многих случаях они взаимозаменяемы, между ними есть ключевые различия.
Type Alias (псевдоним типа) более универсален. Он может описывать примитивы, объединения (Union types), пересечения и кортежи. type ID = string | number;
Interface предназначен исключительно для описания структуры объектов и классов. Главная особенность интерфейсов — возможность декларативного слияния (declaration merging): если объявить одноименный интерфейс дважды, TypeScript объединит их поля. Типы так делать не умеют и выдадут ошибку.
Используйте этот тренажер typescript, чтобы научиться выбирать правильный инструмент для конкретной задачи, понимать совместимость и отличия в синтаксисе.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Сравнение возможностей
В левой колонке перечислены возможности и характеристики, связанные с объявлением типов в TypeScript. В правой колонке указаны две сущности: Interface и Type Alias. Сопоставьте каждую возможность с той сущностью, для которой она характерна или допустима. Обратите внимание, что в правой колонке варианты повторяются, поэтому в проверке учитываются все корректные варианты сопоставления по смыслу.
2. Синтаксис расширения
Дополните фрагмент кода на TypeScript, чтобы определить интерфейс Person с полем name типа string, а затем определить интерфейс Employee, который расширяет Person и добавляет поле employeeId типа number. Вставьте пропущенные ключевые слова в указанные места, чтобы код соответствовал синтаксису расширения интерфейсов.
input1S Person {
name: string;
}
interface Employee input2S Person {
employeeId: number;
}3. Объединение типов
В этом задании вам предстоит создать объединение типов (Union Type) для представления статусов заказа в TypeScript. В коде с пропусками необходимо выбрать подходящие элементы из выпадающих списков, чтобы получить корректное объявление типа и присвоение значения переменной. Обратите внимание, что для объединения строковых литералов используется специальный синтаксис, отличный от интерфейсов.
input1S OrderStatus = "pending" input2S "completed" input3S "cancelled";
const status: OrderStatus = input4S;4. Ошибка дублирования типа
В этом фрагменте TypeScript-кода допущена ошибка, связанная с повторным объявлением типа с одинаковым именем. Код не компилируется из-за конфликта имён. Вам нужно найти строку с ошибкой и исправить её, используя правильную конструкцию языка, которая поддерживает объявление слияния.
// Объявление типа для пользователяtype User = { id: number; name: string;}; // Попытка добавить свойство emailtype User = { email: string;};5. Конструирование пересечения
Из предложенных строк соберите корректную TypeScript-программу, которая определяет два типа (Person и Employee), создаёт новый тип EmployeePerson как их пересечение с помощью оператора '&', объявляет объект этого типа и выводит в консоль значение свойства name. Игнорируйте лишние строки, которые не требуются для решения.
type Person = { name: string; age: number; };type Employee = { company: string; salary: number; };type EmployeePerson = Person & Employee;const emp: EmployeePerson = { name: 'Alice', age: 30, company: 'Tech', salary: 50000 };console.log(emp.name);type Student = { grade: number; };console.log(emp.salary);6. Распределение определений
Перед вами список определений типов на TypeScript. Разнесите их по двум категориям: 'Только Type Alias' и 'Interface или Type Alias'. Обратите внимание, что некоторые конструкции могут быть выражены только через ключевое слово `type`, в то время как другие могут быть созданы как с помощью `type`, так и с помощью `interface`. Каждый элемент должен оказаться в одной из категорий.
type MyString = string;type Person = { name: string; age: number; };type ID = string | number;type Point = [number, number];type Greet = (name: string) => string;type Numbers = number[];type Flag = boolean;type Coordinate = { x: number; y: number; };7. Анализ цепочки наследования
Проанализируйте TypeScript-код сверху и восстановите последовательность шагов, которые выполняются при проверке соответствия объекта интерфейсу B, который расширяет интерфейс A. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить логику проверки обязательных свойств объекта.
interface A {
x: number;
}
interface B extends A {
y: string;
}
const candidate = {
x: 10,
y: "hello"
};
const bObj: B = candidate;
console.log(bObj.x, bObj.y);