TypeScript обладает мощной системой для работы с null и undefined.
По умолчанию обработка null и undefined выключена, и её можно включить, установив параметр strictNullChecks в значение true.
Вся информация в этом разделе применима, когда strictNullChecks включён.
Типы null и undefined
null и undefined — это примитивные типы, которые можно использовать так же, как и другие типы, например, string. Они принимают одноименные значения null и undefined.
Пример
let value: string | undefined | null = null;
value = 'hello';
value = undefined;
Когда параметр strictNullChecks включен, TypeScript требует явно указывать undefined или null в типе, если значение может быть ими.
Необязательная цепочка
Необязательная цепочка — это особенность JavaScript, которая хорошо сочетается с обработкой null в TypeScript.
Она позволяет обращаться к свойству объекта, которое может существовать или нет, используя компактный синтаксис.
Для определения необязательной цепочки при обращении к свойству используется оператор ?..
Пример
interface House {
sqft: number;
yard?: {
sqft: number;
};
}
function printYardSize(house: House) {
const yardSize = house.yard?.sqft;
if (yardSize === undefined) {
console.log('Нет двора');
} else {
console.log(`Размер двора: ${yardSize} квадратных футов`);
}
}
let home: House = {
sqft: 500
};
printYardSize(home); // Вывод: 'Нет двора'
Оператор нулевого объединения
Оператор нулевого объединения — это ещё одна особенность JavaScript, которая отлично работает с обработкой null в TypeScript.
Он позволяет писать выражения с резервным значением, которое вступает в силу только при возникновении null или undefined.
Это полезно, когда в выражении могут встречаться другие ложные значения, которые при этом допустимы.
Для этого в выражениях используют оператор ??, аналогично оператору &&.
Пример
function printMileage(mileage: number | null | undefined) {
console.log(`Пробег: ${mileage ?? 'Недоступно'}`);
}
printMileage(null); // Вывод: 'Пробег: Недоступно'
printMileage(0); // Вывод: 'Пробег: 0'
Оператор утверждения ненулевого значения
Система автоматического вывода типов TypeScript несовершенна, и иногда имеет смысл игнорировать возможность того, что значение может быть null или undefined.
Простой способ сделать это — использовать приведение/переопределение типов, но TypeScript также предоставляет оператор ! как удобное сокращение.
Пример
function getValue(): string | undefined {
return 'hello';
}
let value = getValue();
console.log('Длина значения: ' + value!.length);
Подобно переопределению типов, это может быть небезопасно и должно использоваться с осторожностью.
Обработка границ массива
Даже при включенном параметре strictNullChecks, по умолчанию TypeScript предполагает, что доступ к элементам массива никогда не вернёт undefined (если только undefined не является частью типа массива).
Параметр конфигурации noUncheckedIndexedAccess можно использовать для изменения этого поведения.
Пример
let array: number[] = [1, 2, 3];
let value = array[0]; // При включенном `noUncheckedIndexedAccess` тип будет `number | undefined`