Spec-Zone.ru › JavaScript

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)

Тип ошибки

SyntaxError

Что пошло не так?

Есть два способа получить эту ошибку. Первый — если выражение-тег является выражением опциональной последовательности, например:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API