Пошук уроків, статей та іншого контенту
Глибший погляд на типізацію масивів, кортежів, об'єктів та літеральних значень.
let scores: number[] = [90, 85, 78];
let names: Array<string> = ["Оксана", "Тарас"]; // те саме, інший синтаксисT[] та Array<T> повністю еквівалентні — перший синтаксис зазвичай читається легше для простих типів, другий стає зручнішим для складніших дженерик-типів (детально в окремому уроці про Generics далі в цьому курсі).
На відміну від звичайного масиву (де всі елементи одного типу, а довжина довільна), кортеж фіксує точну кількість елементів і тип кожного окремо за позицією — корисно для значень на кшталт пари координат чи результату функції, що повертає кілька різнотипних значень:
let point: [number, number] = [10, 20];
let entry: [string, number] = ["вік", 30];
// Помилка типів — другий елемент має бути number, а не string:
// let bad: [string, number] = ["вік", "тридцять"];Форму об'єкта не обов'язково виносити в окремий interface (попередній урок) — для одноразового, локального використання тип можна описати прямо на місці:
function printCoordinates(point: { x: number; y: number }): void {
console.log(`X: ${point.x}, Y: ${point.y}`);
}Модифікатор readonly забороняє компілятору дозволити зміну поля після ініціалізації — суто перевірка на етапі компіляції (як і вся типізація TypeScript), а не рантайм-заморозка на кшталт Object.freeze із курсу JavaScript:
interface Config {
readonly apiUrl: string;
}
function setup(config: Config) {
config.apiUrl = "https://other.com"; // помилка компіляції: apiUrl — readonly
}Тип може бути не просто «рядок» чи «число», а конкретним, єдиним допустимим значенням — основа для union-типів статусів і прапорців, детально розібраних в окремому уроці далі:
let direction: "up" | "down" = "up"; // допустимі лише ці два конкретні рядки
// direction = "left"; // помилка компіляції — "left" не входить у дозволений літеральний unionПлутати звичайний масив (T[], довільна довжина) із кортежем ([T, U], фіксована довжина й позиційні типи) — кортеж без явної анотації типу компілятор виведе як звичайний масив.
Очікувати, що readonly забороняє мутацію в рантаймі, як Object.freeze, — це суто перевірка компілятора; сирий JavaScript-код (чи неперевірений TypeScript через as) технічно все одно може змінити поле під час виконання.
Оголошувати змінну без явного типу там, де початкове значення не дає компілятору достатньо інформації (наприклад, let value; без ініціалізації) — тип виводиться як any, втрачаючи всі переваги перевірки типів.
T[] і Array<T> — еквівалентні способи типізувати масив; кортеж [T, U] фіксує точну довжину й тип кожної позиції окремо. Типи об'єктів можна описувати inline для одноразового використання, а не лише через interface. readonly забороняє мутацію на рівні перевірки типів (не в рантаймі), а літеральні типи обмежують значення до конкретного, наперед заданого набору — фундамент для union-типів у наступному модулі.