Этот вопрос проверяет понимание фундаментальной системы типов TypeScript и отличий структурной типизации от номинальной.
Структурная типизация - это подход, при котором совместимость типов определяется их структурой (полями и методами), а не явными объявлениями или именами. TypeScript проверяет, что объект имеет все требуемые свойства с правильными типами, независимо от того, какой тип был объявлен у этого объекта.
Структурная типизация (structural typing) - это основополагающая концепция системы типов TypeScript, которая отличается от номинальной типизации, используемой в таких языках как Java или C#.
В структурной типизации два типа считаются совместимыми, если они имеют одинаковую структуру:
typescript
interface Person {
name: string;
age: number;
}
// Этот объект совместим с Person, хотя он не объявлен как Person
const user = { name: "Иван", age: 30 };
const person: Person = user; // OK - структура совпадаетСтруктурная типизация:
Проверяет форму объектов
Типы с одинаковой структурой совместимы
Используется в TypeScript, Go
Номинальная типизация:
Проверяет явные объявления типов
Требует явного наследования или реализации
Используется в Java, C#
typescript
interface Point {
x: number;
y: number;
}
// Объект с дополнительными свойствами тоже совместим
const point3D = { x: 1, y: 2, z: 3 };
const point: Point = point3D; // OK
function printPoint(p: Point) {
console.log(p.x, p.y);
}
printPoint(point3D); // OK - структура Point присутствуетtypescript
type Adder = (a: number, b: number) => number;
// Функция совместима, если параметры и возвращаемое значение совместимы
const multiply: Adder = (x: number, y: number) => x * y; // OKГибкость: Не требует явных объявлений типов
Декомпозиция: Позволяет легко комбинировать типы
Утилитарность: Фокус на том, что объект может делать, а не что он есть
typescript
interface User {
id: number;
name: string;
}
// Оба объекта структурно совместимы с User
const correctUser = { id: 1, name: "Иван" };
const wrongUser = { id: "1", name: "Иван" }; // Ошибка - id должен быть number
// Но эта проблема выявляется на этапе компиляцииСтруктурная типизация полезна при работе с внешними библиотеками:
typescript
// Мы можем использовать объекты, которые структурно совпадают
// с ожидаемыми типами, без явного приведения типов
fetch('/api/users')
.then(res => res.json())
.then((users: User[]) => {
// TypeScript проверит структуру полученных данных
});Вывод: Структурная типизация делает TypeScript гибким и практичным языком, позволяя работать с объектами на основе их фактической структуры, а не формальных объявлений типов.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию