601 Stimmen

Unterstützt TypeScript den ?. Operator? (Und, wie wird er genannt?)

Unterstützt Typescript derzeit (oder gibt es Pläne dafür) den sicheren Navigations Operator von ?.?

d.h.:

var thing = foo?.bar
// das Gleiche wie:
var thing = (foo) ? foo.bar : null;

Gibt es auch einen gebräuchlicheren Namen für diesen Operator (es ist unglaublich schwer, danach zu googeln).

381voto

Donut Punkte 103447

Ja. Ab TypeScript 3.7 (veröffentlicht am 5. November 2019) wird dieses Feature unterstützt und heißt Optional Chaining:

Im Kern ermöglicht optional chaining uns, Code zu schreiben, bei dem TypeScript einige Ausdrücke sofort stoppen kann, wenn ein null oder undefined auftritt. Der Star der Show beim optional chaining ist der neue Operator ?. für optionale Eigenschaftszugriffe.

Siehe die TypeScript 3.7 Release Notes für weitere Details.


Vor Version 3.7 wurde dies in TypeScript nicht unterstützt, obwohl es bereits frühzeitig angefordert wurde (seit Issue #16 im TypeScript-Repository aus dem Jahr 2014).

Was den Namen dieses Operators betrifft, scheint es keinen Konsens zu geben. Neben "optional chaining" (so wird es auch in JavaScript und Swift genannt) gibt es ein paar weitere Beispiele:

  • CoffeeScript nennt es den existential operator (speziell die "accessor variant" des existential operators):

Die accessor-Variante des existential operators ?. kann verwendet werden, um Nullverweise in einer Eigenschaftenkette aufzusaugen. Verwenden Sie ihn anstelle des Punkt-Zugriffs . in Fällen, in denen der Basistwert möglicherweise null oder undefined ist.

Ein null-conditional operator wendet einen Memberzugriff ?. oder Elementzugriff ?[] nur auf seinen Operanden an, wenn dieser nicht null ist; andernfalls gibt er null zurück.

Es gibt wahrscheinlich noch viele andere Beispiele.

157voto

A. K-R Punkte 2002

Es ist jetzt möglich, siehe Antwort des Benutzers "Donut".

Alte Antwort: Das Standard-JavaScript-Verhalten in Bezug auf boolesche Operatoren hat etwas, das helfen könnte. Die booleschen Methoden geben nicht true oder false zurück, wenn Objekte verglichen werden, sondern im Fall von OR den ersten Wert, der gleich true ist.

Nicht so schön wie ein einzelnes ?, aber es funktioniert:

var ding = foo && foo.bar || null;

Sie können so viele && verwenden, wie Sie möchten:

var ding = foo && foo.bar && foo.bar.check && foo.bar.check.x || null;

Standardwerte sind auch möglich:

var name = person && person.name || "Unbekannter Benutzer";

119voto

Fenton Punkte 221749

Dies ist in der ECMAScript Optional Chaining-Spezifikation definiert, daher sollten wir uns wahrscheinlich auf optionale Verkettung beziehen, wenn wir darüber diskutieren. Wahrscheinliche Implementierung:

const result = a?.b?.c;

Kurz gesagt, das TypeScript-Team wartet darauf, dass die ECMAScript-Spezifikation präzisiert wird, damit ihre Implementierung in Zukunft nicht brechen wird. Wenn sie jetzt etwas implementieren würden, würden sie möglicherweise größere Änderungen benötigen, wenn ECMAScript ihre Spezifikation neu definieren.

Siehe Optional Chaining-Spezifikation

Wenn etwas niemals Standard-JavaScript werden soll, kann das TypeScript-Team implementieren, wie sie es für richtig halten. Für zukünftige ECMAScript-Ergänzungen möchten sie jedoch die Semantik bewahren, auch wenn sie frühzeitigen Zugriff gewähren, wie sie es für viele andere Funktionen getan haben.

Kurzbefehle

Alle funkigen Operatoren von JavaScript sind verfügbar, einschließlich der Typumwandlungen wie...

var n: number = +myString; // in Zahl umwandeln
var b: bool = !!myString; // in bool umwandeln

Manuelle Lösung

Aber zurück zur Frage. Ich habe ein obskures Beispiel, wie man in JavaScript (und daher TypeScript) etwas Ähnliches machen kann, obwohl ich definitiv nicht behaupte, dass es so elegant ist wie das Feature, nach dem du wirklich suchst.

(foo||{}).bar;

Also, wenn foo undefined ist, ist das Ergebnis undefined und wenn foo definiert ist und eine Eigenschaft namens bar hat, die einen Wert hat, ist das Ergebnis dieser Wert.

Ich habe ein Beispiel auf JSFiddle erstellt.

Dies sieht für längere Beispiele ziemlich zwielichtig aus.

var postleitzahl = ((person||{}).adresse||{}).postleitzahl;

Chain-Funktion

Wenn du verzweifelt eine kürzere Version möchtest, während die Spezifikation noch nicht endgültig ist, verwende ich diese Methode manchmal. Sie bewertet den Ausdruck und gibt einen Standardwert zurück, wenn die Verkettung nicht erfüllt werden kann oder null/undefined endet (beachte, dass hier das != wichtig ist, wir wollen hier ein wenig positives Hin- und Herschalten).

function chain(exp: () => T, d: T) {
    try {
        let val = exp();
        if (val != null) {
            return val;
        }
    } catch { }
    return d;
}

let obj1: { a?: { b?: string }} = {
    a: {
        b: 'c'
    }
};

// 'c'
console.log(chain(() => obj1.a.b, 'Nichts'));

obj1 = {
    a: {}
};

// 'Nichts'
console.log(chain(() => obj1.a.b, 'Nichts'));

obj1 = {};

// 'Nichts'
console.log(chain(() => obj1.a.b, 'Nichts'));

obj1 = null;

// 'Nichts'
console.log(chain(() => obj1.a.b, 'Nichts'));

115voto

basarat Punkte 230827

Aktualisierung: Ja, jetzt wird es unterstützt!

Es wurde gerade mit TypeScript 3.7 veröffentlicht: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/

Es nennt sich optionale Verkettung: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#optional-chaining

Damit ist folgendes möglich:

let x = foo?.bar.baz(); 

ist gleichwertig mit:

let x = (foo === null || foo === undefined) ?
    undefined :
    foo.bar.baz();

Alte Antwort

Es gibt eine offene Feature-Anforderung dafür auf github, wo du deine Meinung / Wunsch äußern kannst: https://github.com/Microsoft/TypeScript/issues/16

42voto

Jose A Punkte 8659

Bearbeiten Sie den 13. November 2019!

Ab dem 5. November 2019 wurde TypeScript 3.7 veröffentlicht und unterstützt jetzt den optionalen Kettenoperator ?.!!!

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining


Nur aus historischen Gründen:

Bearbeiten: Ich habe die Antwort aktualisiert, Dank des Kommentars von fracz.

TypeScript 2.0 veröffentlichte !.. Es ist nicht das gleiche wie ?. (Safe Navigator in C#)

Weitere Details siehe diese Antwort:

https://stackoverflow.com/a/38875179/1057052

Dies sagt dem Compiler nur, dass der Wert nicht null oder undefined ist. Es wird nicht überprüfen, ob der Wert null oder undefined ist.

TypeScript Non-null assertion operator

// Kompiliert mit --strictNullChecks
function validateEntity(e?: Entity) {
    // Ausnahme werfen, wenn e null oder ungültige Entität ist
}

function processEntity(e?: Entity) {
    validateEntity(e);
    let s = e!.name;  // Angabe, dass e nicht null ist und auf name zugreifen
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X