- Это оператор нулевого распространения (также известный как экзистенциальный оператор). Использование оператора называется необязательной или условной цепочкой.
- Этот оператор полезен, когда необходимо получить доступ к глубоко вложенному правильно значению объекта, где промежуточные свойства могут иметь значение null / undefined.
Например, рассмотрим этот объект «Человек»
let person = {
name : {
first : "John",
last : "Doe"
},
age : 31
}
Я бы получил доступ к фамилии этого человека как
let lastName = person.name.last;
Это все здорово, но что, если объект имени не существует? Ну, предыдущая строка кода выдала бы следующую ошибку:
Uncaught TypeError: невозможно прочитать свойство 'last' из undefined
Чтобы решить эту проблему, свойство name должно быть проверено на убедитесь, что он существует. Это превратит наш простой лайнер в следующий код
let lastName;
if(person.name){
lastName = person.name.last;
}
или
let lastName = person && person.name && person.name.last
Первый вариант - это просто хлопот, а второй вариант тоже не хорош. (Я лично считаю, что синтаксис сбивает с толку). Для объяснения второй вариант проверяет, является ли человек правдивым, если это так, он проверяет, является ли person.name правдой, если это person.name.last будет сохранено в lastName.
Итак, вот маг c оператора нулевого распространения, я могу переписать все приведенные выше фрагменты как
let lastName = person?.name?.last
Теперь, если имя или имя равно null / undefined lastName будет установлено в null / undefined, и ошибка не будет. Для объектов с высокой степенью вложенности это может сэкономить много строк кода и проверки ошибок.
Технически это только предлагаемое изменение ES7 (
https://github.com/tc39/proposal-optional-chaining), но работает, если вы опробуете его в консоли любого браузера Chrome.
Typescript поддерживает необязательное связывание с 3,7 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional -цепь