TypeScript виводить типи (type inference) з ініціалізації, повернених значень і контексту. Анотації потрібні не всюди - надлишкові лише засмічують код.
const title = 'Laravel Ukraine'; // string - виведено
const ids = [1, 2, 3]; // number[]
const user = { id: 7, name: 'Оля' }; // { id: number; name: string }
function total(prices: number[]) { // параметри - анотувати
return prices.reduce((sum, p) => sum + p, 0); // повернення number - виведено
}
Де анотація обов'язкова або корисна:
- параметри функцій - TypeScript не знає, що в них передадуть (виняток - колбеки, де тип відомий з контексту:
ids.map((id) => ...)); - змінна без ініціалізатора:
let current: User | null = null;- інакше тип буде лишеnull; - порожні колекції:
const errors: string[] = [];- інакшеnever[]чиany[]; - публічний API модуля - експортовані функції з явним типом повернення: помилка в реалізації буде помічена в самій функції, а не в місцях виклику, і зміна поведінки не змінить API непомітно;
- коли виведений тип ширший за потрібний:
const status: 'draft' | 'published' = 'draft'- щоб змінна не стала простоstringдляlet.
Основні типи:
- примітиви:
string,number,boolean,bigint,symbol,null,undefined; - масиви:
string[]абоArray<string>; - об'єкти:
{ id: number; email?: string }(?- необов'язкове поле); - об'єднання:
string | number; - функції:
(value: string) => boolean.
Що не варто анотувати: очевидні локальні змінні (const count: number = 0) - це шум. Те саме з типом повернення простих внутрішніх функцій.
Корисна перевірка в редакторі: наведення курсору показує виведений тип. Якщо він any чи несподівано широкий - місце для анотації.
strict: true вмикає noImplicitAny: параметр без анотації, тип якого не вдалося вивести, стане помилкою, а не тихим any. З TypeScript 6.0 strict увімкнено за замовчуванням - у старих проєктах його варто перевірити явно в tsconfig.