Коротка відповідь
juniorRecords — це типи, що описують об’єкти з фіксованим набором ключів і значень; tuples — це послідовності, де кожен елемент має визначений тип і порядок. Обидва забезпечують статичну перевірку, проте records мають ключі як string/number, а tuples — індексовані позиції. Звичайні об’єкти допускають довільну кількість полів і не гарантують типу елементів, що ускладнює статичну аналізу.
Повне пояснення
Що це і навіщо
- Records – тип, що представляє об’єкт з фіксованим набором ключів. Використовуються, коли потрібна сувора структура даних з чітко визначеними полями.
- Tuples – послідовність значень, де кожен елемент має свій тип і порядок. Підходять для повернення декількох значень з функції або представлення координат.
Ключові принципи/терміни
- Key‑value mapping – у records ключі можуть бути
string,numberабоsymbol. - Index signature – у tuples індекси починаються з
0і кожен елемент має свій тип. - Readonly – обидва типи можуть бути оголошені як
readonlyдля запобігання мутації.
Як це працює
- TypeScript компілятор перевіряє, що об’єкт відповідає запису: всі вказані ключі присутні і мають правильний тип.
- Для tuples компілятор перевіряє довжину і тип кожного елемента.
Практика та реалізація
// Record
type User = Record<'id' | 'name', string>;
const user: User = { id: '1', name: 'Alice' };
// Tuple
type Point = [number, number];
const point: Point = [10, 20];
Тестування
import { expect } from 'vitest';
type Pair = [string, number];
const pair: Pair = ['age', 30];
expect(pair[0]).toBe('age');
Особливості в контексті JS/TS
- У JavaScript об’єкти не мають статичної типізації; records і tuples існують лише в TypeScript.
- При передачі об’єкта у функцію, яка очікує Record, TypeScript дозволяє «податись» (excess property check) лише при літералі.
Оптимізація, типові помилки та edge cases
- Перевищення довжини tuple: TypeScript видає помилку.
- Відсутність ключа в Record: компілятор помилку.
- Мутація readonly tuple/record: TypeScript забороняє присвоєння.
Диагностика і відладка
- Якщо TypeScript не помічає помилку, перевірте, чи використовується
as constабоreadonly. - Для об’єктів, що мають динамічні ключі, використовуйте
Record<string, unknown>.
Альтернативи
- Interfaces – більш гнучкі, дозволяють розширювати тип.
- Classes – забезпечують конструктор і методи, але не потрібні для простих структур.
Часті помилки (8)
- Відсутність ключа у Record → компілятор помилка.
- Надлишковий ключ у літералі Record → "excess property" помилка.
- Невідповідний тип елемента у tuple → компілятор помилка.
- Перевищення довжини tuple → помилка.
- Мутація readonly tuple/record → помилка присвоєння.
- Використання
anyу Record → втрата типізації. - Неправильний індекс у tuple (наприклад,
tuple[2]при довжині 2) → runtime помилка. - Змішування Record і tuple у одній змінній → типова помилка.
Cheatsheet
Record<K, V>– об’єкт з ключами K і значеннями V.[T1, T2, ...]– tuple з елементами типів T1, T2, …readonly– запобігає мутації.
Follow‑up питання
- Як перевірити, що об’єкт відповідає Record без явного типу?
- Чи можна мати tuple з необов’язковими елементами?