Skip to main content

Чому TS не вимагає завжди писати типи явно?

1. TypeScript сам "розуміє" типи з контексту

Коли ти оголошуєш змінну і присвоюєш їй значення, TypeScript аналізує це значення і автоматично присвоює йому відповідний тип.

javascript
let name = "Alice"; // TS розуміє: name має тип string

Тому писати let name: string = "Alice" - необов'язково. TypeScript сам виведе тип string із присвоєного значення.


2. Це називається type inference (виведення типів)

TypeScript уміє "вгадувати" тип:

  • із присвоєного значення (let count = 5 -> number);
  • із значення, яке повертає функція;
  • із типу аргументів функції;
  • із контексту виклику (наприклад, у колбеках, деструктуризації тощо).

Приклад:

javascript
function greet(name = "гість") { return `Привіт, ${name}!`; } // TypeScript виводить: name - string, тип, що повертається, - string

3. Приклад: функція з виведенням типу значення, що повертається

javascript
function add(a: number, b: number) { return a + b; }

TypeScript автоматично визначає, що функція повертає number, тому що a і b - числа.

Тобто можна не писати : number після дужок - тип виведеться сам.


4. Приклад з масивами й об'єктами

javascript
let numbers = [1, 2, 3]; // TypeScript виводить тип: number[] let user = { id: 1, name: "Tim" }; // TypeScript виводить тип: { id: number; name: string; }

Якщо пізніше ти спробуєш додати до numbers рядок - компілятор не дозволить, тому що вже знає, що це масив чисел.


5. Чому це корисно

  1. Менше коду - не потрібно дублювати очевидні типи.
  2. Код чистіший і читабельніший - типи залишаються там, де вони справді потрібні.
  3. Типи все одно є - навіть якщо ти їх не пишеш, TypeScript зберігає їх "в умі".
  4. Автодоповнення в IDE так само працює (TS знає inferred-типи).

6. Але іноді потрібно писати типи явно

TypeScript не завжди може точно вивести тип, наприклад:

  • при ініціалізації змінної без значення;
  • при поверненні складних типів (Promise, union, generic);
  • коли важливо зафіксувати тип (щоб не змінювався динамічно).

Приклад:

javascript
let id; // тип any - без анотації TypeScript не знає, що це id = 5; // тепер number id = "5"; // теж допустимо - тип став any // Краще явно: let id: number;

7. Правило "розумної надлишковості"

TypeScript намагається не змушувати тебе писати те, що й так очевидно. Типи потрібні там, де:

  • компілятор не може їх вивести,
  • або де вони важливі для чіткого контракту між частинами коду (наприклад, інтерфейси, функції, API).

Підсумок

TypeScript не вимагає завжди писати типи, тому що він уміє автоматично виводити їх з контексту коду - цей процес називається type inference.

Це робить код чистим, але водночас безпечним, зберігаючи всі переваги типізації без надлишковості.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.