Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про TypeScript: type, structural, interface

Что произойдёт, если передать объект с такой же структурой, как требуемый тип, но с другим именем типа?

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

Короткий ответ

Объект будет принят без ошибок, потому что TypeScript использует структурную типизацию. Компилятор проверяет только структуру объекта (наличие нужных полей с правильными типами), а не имя типа. Если структуры совпадают, типы считаются совместимыми.

Длинный ответ

Совместимость типов с одинаковой структурой

В TypeScript имена типов не имеют значения для проверки совместимости - важна только структура.

Базовый пример

typescript

interface Person {
  name: string;
  age: number;
}

class Employee {
  name: string;
  age: number;
  salary: number;
}

// Employee совместим с Person, так как содержит все нужные поля
const person: Person = new Employee(); // OK

function greet(p: Person) {
  console.log(`Привет, ${p.name}`);
}

greet(new Employee()); // OK - структура совпадает

Типы с идентичной структурой

Даже если типы объявлены совершенно отдельно:

typescript

interface Car {
  brand: string;
  year: number;
}

interface Vehicle {
  brand: string;
  year: number;
}

const car: Car = { brand: "Toyota", year: 2020 };
const vehicle: Vehicle = car; // OK - структуры идентичны

function processCar(c: Car) { /* ... */ }
processCar(vehicle); // OK

Разные типы с пересекающейся структурой

typescript

interface Animal {
  name: string;
  age: number;
}

interface Pet {
  name: string;
  age: number;
  owner: string;
}

const animal: Animal = { name: "Барсик", age: 2 };
const pet: Pet = { name: "Шарик", age: 3, owner: "Иван" };

// Pet совместим с Animal (имеет все нужные поля)
const animalFromPet: Animal = pet; // OK

// Animal не совместим с Pet (не хватает поля owner)
// const petFromAnimal: Pet = animal; // Ошибка!

Практические сценарии

1. Работа с API

typescript

// Тип из нашей системы
interface User {
  id: number;
  name: string;
  email: string;
}

// Данные от API могут иметь другую структуру, но быть совместимыми
const apiResponse = {
  id: 1,
  name: "Иван",
  email: "ivan@example.com",
  createdAt: "2023-01-01"
};

const user: User = apiResponse; // OK - есть все обязательные поля

2. Функции с параметрами

typescript

interface Config {
  timeout: number;
  retries: number;
}

function setupAPI(config: Config) {
  // ...
}

// Передаем объект с дополнительными свойствами
setupAPI({
  timeout: 5000,
  retries: 3,
  baseURL: "/api" // Дополнительное свойство - OK
});

Ограничения при прямом присваивании

При прямом присваивании литералов объекта TypeScript строже:

typescript

interface Point {
  x: number;
  y: number;
}

// Избыточные свойства не допускаются при прямом присваивании
// const p: Point = { x: 1, y: 2, z: 3 }; // Ошибка!

// Но через переменную - OK
const point3D = { x: 1, y: 2, z: 3 };
const p: Point = point3D; // OK

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • TypeScript

    TypeScript

Ключевые слова

#type

#structural

#interface

Подпишись на React Developer в телеграм