SyntaxError: помеченный шаблон не может использоваться с оператором опциональной последовательности
Исключение JavaScript "помеченный шаблон не может использоваться с оператором опциональной последовательности" возникает, когда выражение-тег помеченного шаблонного литерала является опциональной последовательностью (optional chain), или если опциональная последовательность присутствует между тегом и шаблоном.
Сообщение
SyntaxError: Invalid tagged template on optional chain (V8-based) SyntaxError: tagged template cannot be used with optional chain (Firefox) SyntaxError: Cannot use tagged templates in an optional chain. (Safari)
Тип ошибки
Что пошло не так?
Есть два способа получить эту ошибку. Первый — если выражение-тег является выражением опциональной последовательности, например:
String?.raw`Hello, world!`; console.log?.()`Hello, world!`; Number?.[parseMethod]`Hello, world!`;
Второй — если ?. встречается между тегом и шаблоном, например:
String.raw?.`Hello, world!`;
Оператор опциональной последовательности в теге специально запрещен, потому что для этого нет весомых сценариев использования, и неясно, какой результат ожидается (должно ли это быть undefined или значение шаблона, как если бы он был без тега?). Вам нужно преобразовать опциональную последовательность в ее основное условие (дополнительную информацию см. в optional chaining).
const result =
String.raw === null || String.raw === undefined
? undefined
: String.raw`Hello, world!`;
Помните, что опциональная последовательность выполняет короткое замыкание только внутри заключенной в скобки единицы. Если вы заключите выражение-тег в скобки, опциональная последовательность не вызовет ошибку, поскольку теперь тег не выполняет короткого замыкания, и результат ясен (тег сгенерирует undefined, а затем вызовет исключение в помеченном шаблоне).
(console?.log)`Hello, world!`; // Throws if console?.log is undefined
Однако в любом случае это несколько бессмысленно, поскольку опциональная последовательность предотвращает ошибки внутри цепочки доступа к свойствам, но затем гарантированно генерирует ошибку при вызове тега шаблона. Вероятно, вам все равно потребуется использовать условную проверку.
Обратите внимание, что оператор опциональной последовательности запрещен только в качестве выражения-тега. Вы можете использовать опциональную последовательность внутри встроенных выражений или применять опциональную последовательность к помеченному шаблонному выражению в целом.
console.log`Hello, ${true.constructor?.name}!`; // ['Hello, ', '!', raw: Array(2)] 'Boolean'
console.log`Hello`?.toString(); // undefined
См. также
- Шаблонные литералы
- Оператор опциональной последовательности (
?.) - Исходное обсуждение о том, следует ли разрешать опциональную последовательность в помеченных шаблонных литералах
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Bad_optional_template