SyntaxError: Das Schlüsselwort new kann nicht mit einer optionalen Verkettung verwendet werden

Der JavaScript-Ausnahmefehler "das Schlüsselwort new kann nicht mit einer optionalen Verkettung verwendet werden" tritt auf, wenn der Konstruktor eines new-Ausdrucks eine optionale Verkettung ist oder wenn eine optionale Verkettung zwischen dem Konstruktor und der geklammerten Argumentliste vorhanden ist.

Nachricht

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)

Fehlertyp

Was ist schiefgelaufen?

Es gibt zwei Möglichkeiten, diesen Fehler zu erzeugen. Die erste Möglichkeit ist, wenn der Konstruktor-Ausdruck eine optionale Verkettungsausdruck ist, wie hier:

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

Die zweite Möglichkeit ist, wenn ?. zwischen dem Konstruktor und der Argumentliste auftritt, wie hier:

js
new Intl.DateTimeFormat?.();

Ein optionales new ist speziell verboten, weil seine Syntax kompliziert ist (new mit und ohne Argumente) und das Ergebnis unklar ist (es wäre der einzige Fall, in dem new nicht zu einem Objektwert ausgewertet wird). Sie müssen die optionale Verkettung in ihre grundlegende Bedingung übersetzen (sehen Sie sich die optionale Verkettung für weitere Informationen an).

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

Denken Sie daran, dass die optionale Verkettung nur innerhalb einer geklammerten Einheit kurzschließt. Wenn Sie Ihren Konstruktor-Ausdruck klammern, wird die optionale Verkettung keinen Fehler verursachen, da jetzt der Konstruktor nicht mehr kurzschließt und das Ergebnis klar ist (der Konstruktor wird undefined produzieren und dann die new-Ausdruck verursachen, um einen Fehler zu werfen).

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

Dies ist jedoch sowieso etwas unsinnig, da die optionale Verkettung Fehler innerhalb der Eigenschafts-Zugriffs-Kette verhindert, dann aber garantiert einen Fehler bei der Verwendung von new erzeugt. Sie möchten wahrscheinlich immer noch eine Bedingungsprüfung verwenden.

Beachten Sie, dass die optionale Verkettung nur als Konstruktor-Ausdruck verboten ist. Sie können die optionale Verkettung in der Argumentliste verwenden oder die optionale Verkettung auf den gesamten new-Ausdruck anwenden.

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

Beachten Sie, dass es nicht nötig ist, ?. auf dem new-Ausdruck selbst zu verwenden: new a()?.b, weil new garantiert einen nicht-nullish Objektwert erzeugt.

Siehe auch