Spec-Zone.ru › JavaScript

SyntaxError: ключевое слово new не может быть использовано с опциональной цепочкой

Исключение JavaScript "new keyword cannot be used with an optional chain" возникает, когда конструктор выражения new является опциональной цепочкой, или если между конструктором и списком аргументов в скобках имеется опциональная цепочка.

Сообщение

SyntaxError: Invalid optional chain from new expression (V8-based)
SyntaxError: new keyword cannot be used with an optional chain (Firefox)
SyntaxError: Cannot call constructor in an optional chain. (Safari)

Тип ошибки

SyntaxError

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

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

new Intl?.DateTimeFormat();
Number?.[parseMethod]`Hello, world!`;

Второй — если ?. встречается между конструктором и списком аргументов, например:

new Intl.DateTimeFormat?.();

Опциональный new специально запрещен, потому что его синтаксис сложен (new с аргументами и без них), а результат неясен (это был бы единственный случай, когда new не вычисляется в значение объекта). Вам необходимо преобразовать опциональную цепочку в её базовое условие (см. опциональная цепочка для получения дополнительной информации).

const result =
  Intl.DateTimeFormat === null || Intl.DateTimeFormat === undefined
    ? undefined
    : new Intl.DateTimeFormat();

Помните, что опциональная цепочка выполняет короткое замыкание только внутри заключенного в скобки блока. Если вы заключите выражение конструктора в скобки, опциональная цепочка не вызовет ошибку, потому что теперь конструктор не выполняет короткое замыкание, и результат ясен (конструктор выдаст undefined, а затем заставит выражение new выбросить исключение).

new (Intl?.DateTimeFormat)(); // Throws if Intl?.DateTimeFormat is undefined

Однако это все равно немного бессмысленно, потому что опциональная цепочка предотвращает ошибки внутри цепочки доступа к свойствам, но затем гарантированно генерирует ошибку при вызове new. Вероятно, вы все равно захотите использовать условную проверку.

Обратите внимание, что опциональная цепочка запрещена только как выражение конструктора. Вы можете использовать опциональную цепочку внутри списка аргументов или использовать опциональную цепочку для выражения new в целом.

new Intl.DateTimeFormat(navigator?.languages);
new Intl.DateTimeFormat().resolvedOptions?.();

Обратите внимание, что нет необходимости использовать ?. для самого выражения new: new a()?.b, поскольку new гарантированно выдает ненулевое объектное значение.

См. также

  • new
  • Опциональная цепочка (?.)
  • Исходное обсуждение о том, следует ли разрешать "optional new"

© 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_new_optional

Spec-Zone.ru

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