Необязательные вызовы и доступ к элементам
Используйте ?.() и ?.[] для безопасных вызовов методов и индексации
«Необязательные вызовы и доступ к элементам» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Не только доступ к свойствам
Необязательная цепочка не ограничивается конструкцией obj?.prop. У неё есть ещё две формы: необязательные вызовы с помощью ?.() и необязательный доступ к элементам с помощью ?.[index]. Обе формы прекращают вычисление при значении null или undefined, как и доступ к свойствам.
type Obj = { greet?: () => string };
const o: Obj = {};
console.log(o.greet?.()); // undefined, no crashНеобязательные вызовы методов
Используйте obj.method?.(), чтобы вызвать метод только при его наличии. Если method равен null или undefined, вызов пропускается, а выражение возвращает undefined.
type Logger = { log?: (m: string) => void };
const silent: Logger = {};
silent.log?.('hello'); // skipped, no error
console.log('continued safely');Где размещать ?.
Конструкция ?. размещается непосредственно перед скобками вызова. obj.method?.() проверяет method, а не obj. Чтобы защитить также и obj, напишите obj?.method?.().
type Api = { send?: (x: number) => number };
const api: Api | null = null;
console.log(api?.send?.(5)); // undefined; guards both api and sendВызов необязательных обратных вызовов
Очень распространённый вариант использования — вызов необязательного параметра обратного вызова. Вместо проверки с помощью if напишите callback?.(), чтобы вызвать его только при переданном значении.
function run(onDone?: () => void): void {
console.log('working...');
onDone?.(); // call only if passed
}
run();
run(() => console.log('finished'));Необязательный доступ к элементам
Для массивов или индексных сигнатур, которые могут иметь значение null или undefined, используйте arr?.[index]. Если arr равен null или undefined, вычисление доступа прекращается; в противном случае элемент считывается обычным образом.
const list: string[] | undefined = undefined;
console.log(list?.[0]); // undefined, no crashДоступ к элементам по динамическим ключам
Необязательный доступ к элементам также работает с квадратными скобками для динамических или вычисляемых ключей объекта, который может иметь значение null или undefined.
type Dict = { [key: string]: number };
const data: Dict | null = { a: 1, b: 2 };
const key = 'a';
console.log(data?.[key]); // 1Сочетание доступа к элементам и вызовов
Вы можете свободно сочетать эти формы. Сначала обратитесь к элементу необязательного массива, а затем при необходимости вызовите метод этого элемента — каждый ?. защищает свой шаг.
type Handlers = Array<{ fire?: () => string }>;
const hs: Handlers | undefined = [{ fire: () => 'boom' }];
console.log(hs?.[0]?.fire?.());Необязательная цепочка для результатов функций
Цепочку можно продолжить от любого значения, возвращённого функцией. Если функция возвращает null или undefined, последующие вызовы или обращения безопасно прекращают вычисление.
function getHandler(): (() => string) | undefined {
return undefined;
}
console.log(getHandler()?.()); // undefinedТип результата включает неопределённое значение
Как и цепочки обращений к свойствам, необязательные вызовы и доступ к элементам добавляют undefined в тип результата. Объедините их с ??, чтобы задать значение по умолчанию и убрать undefined.
type Obj = { compute?: () => number };
const o: Obj = {};
const value = o.compute?.() ?? 0;
console.log(value);Защита обработчиков событий
В коде пользовательского интерфейса и обработке событий необязательные вызовы удобно используют для вызова обработчиков, которые могут быть не заданы. Не нужны громоздкие проверки существования, и отсутствие обработчика не приводит к сбою.
type Props = { onClick?: (id: number) => void };
function click(p: Props, id: number): void {
p.onClick?.(id); // safe if onClick is missing
}
click({ onClick: (id) => console.log('clicked', id) }, 7);
click({}, 8);Пример диспетчера плагинов
Объединим всё вместе: диспетчер, который при необходимости вызывает именованную точку расширения плагина из возможно неполного реестра и задаёт результат по умолчанию, если обработчик ничего не обработал.
type Hooks = { [name: string]: (() => string) | undefined };
const hooks: Hooks = { save: () => 'saved' };
function fire(name: string): string {
return hooks[name]?.() ?? 'no handler';
}
console.log(fire('save'), fire('delete'));Быстрая проверка
Проверьте, насколько хорошо Вы поняли необязательные вызовы и доступ к элементам.
Итоги: необязательные вызовы и доступ
Вы изучили другие формы необязательной цепочки:
obj.method?.()вызывает метод только при его наличии.arr?.[index]безопасно считывает элемент из контейнера, который может иметь значениеnullилиundefined.- Все формы возвращают
undefinedи прекращают вычисление при операнде со значениемnullилиundefined. - Сочетайте их с
??, чтобы задать результат по умолчанию.
Следующий курс: основы readonly и неизменяемости.
type Cfg = { init?: () => void };
const c: Cfg = {};
c.init?.();
console.log('ran safely');Изучай TypeScript с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 101
- Уроки
- 352
Часто задаваемые вопросы
Урок «Необязательные вызовы и доступ к элементам» бесплатный?
Да — полный текст урока «Необязательные вызовы и доступ к элементам» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Необязательные вызовы и доступ к элементам»?
Используйте ?.() и ?.[] для безопасных вызовов методов и индексации Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Необязательные вызовы и доступ к элементам»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Необязательная цепочка с ?.
- Объединение с nullish с помощью ??
- Объединение ?. и ??
- Необязательные вызовы и доступ к элементам