Без strictNullChecks значення null і undefined можна присвоїти будь-якому типу - і TypeScript не попереджає про найчастішу помилку JavaScript: Cannot read properties of undefined.
З strictNullChecks (входить у strict: true) null і undefined - окремі типи, і їх треба явно дозволити:
let name: string = null; // помилка
let middleName: string | null = null; // ок
function findUser(id: number): User | undefined {
return users.find((u) => u.id === id);
}
const user = findUser(5);
user.name; // помилка: user може бути undefined
Як працювати з можливою відсутністю значення:
// перевірка - TypeScript звужує тип
if (user) {
user.name; // User
}
// опціональний ланцюжок
const city = user?.address?.city; // string | undefined
// значення за замовчуванням
const displayName = user?.name ?? 'Гість';
// ранній вихід
if (!user) throw new Error('Користувача не знайдено');
user.name; // далі - User
Необов'язкові властивості (email?: string) мають тип string | undefined. Перед використанням - перевірка.
null чи undefined? У JavaScript обидва означають «немає значення»:
undefined- «не задано» (необов'язкові параметри, відсутні поля, результатfind);null- «навмисно порожньо» (часто з бази й API: Laravel серіалізуєNULLколонки якnullу JSON).
Корисно домовитися в проєкті: наприклад, undefined у власному коді, а null - там, де так приходить з сервера.
Оператор ! (non-null assertion) - user!.name - каже компілятору «повір, тут не null». Перевірки під час виконання немає: якщо твердження хибне, помилка повернеться. Використовувати лише там, де гарантію справді дає щось поза системою типів, і краще з коментарем.
Чому це найцінніша опція strict: вона змушує обробити випадки «не знайдено», «ще не завантажено», «поле не заповнене» - саме там, де найчастіше падають застосунки.