Ich habe einen Tippfehler in TypeScript gemacht, der während der Codeüberprüfung festgestellt wurde.

Ich habe someArray.indexOf[someObject] anstelle von someArray.indexOf(someObject) verwendet.

Ich würde einen Fehler von der IDE / dem Compiler erwarten. Stattdessen wurden keine Fehler ausgelöst und das Ergebnis war einfach undefiniert.

Kann jemand das erklären?

30
De Wet van As 18 Jän. 2019 im 15:51

4 Antworten

Beste Antwort

Ziemlich leicht.

someArray.indexOf Sie wissen, dass dies ein function ist, das auch ein Objekt ist und Eigenschaften haben kann.

Mit someArray.indexOf[someObject] versuchen Sie, die Eigenschaft mit dem Schlüssel zu erreichen, der auf den Wert someObject bewertet ist.

Natürlich ist es in der Funktion indexOf nicht definiert, daher wird undefined zurückgegeben.

Ein kurzes Beispiel, das die Syntax und die Tatsache veranschaulicht, dass eine Funktion Eigenschaften haben kann;):

const array = [];
array.indexOf['anyValue'] = 'test';
console.log(array.indexOf.anyValue);

BEARBEITEN

Hier ist ein Versuch einer Antwort für die TypeScript-Seite der Frage.

Wie Sie bereits wissen, ist TypeScript so konzipiert, dass es mit JavaScript kompatibel ist. Daher können Sie wie in JS auf folgende Weise auf eine Eigenschaft eines Objekts zugreifen:

  • 'Statisch': obj.property
  • 'Dynamisch': obj['property']

Wenn Sie den statischen Weg verwenden, um auf eine Eigenschaft zuzugreifen, wird TypeScript natürlich einen Fehler auslösen!

Mit der dynamischen Art des Zugriffs auf die Eigenschaft kann der TypeScript-Compiler jedoch nicht den Typ der Eigenschaft bestimmen oder feststellen, ob sie vorhanden ist oder nicht, da der Wert zwischen Klammern zur Laufzeit nach dem Transpilieren von TypeScript ausgewertet wird.

Deshalb wird es implizit als any markiert.

Wie David Sherret in seiner Antwort erwähnt hat, können Sie TypeScript zwingen, einen Fehler auszulösen, indem Sie das Flag --noImplicitAny hinzufügen. Weitere Informationen hierzu finden Sie in seiner Antwort!

Hoffe das hilft;)

34
sjahan 18 Jän. 2019 im 16:03

Es tritt kein Fehler auf, da die --noImplicitAny Compileroption dies nicht ist aktiviert. Wenn diese Compileroption aktiviert ist, wird wie erwartet eine Fehlermeldung angezeigt:

noImplicitAny enabled

Der Grund dafür ist, dass ein Elementzugriffsausdruck ein Objekt zurückgibt, das als any eingegeben wurde, wenn der Typ kein Indexsignatur definiert (dies ist eine implizite any).

enter image description here

Da --noImplicitAny nicht aktiviert ist, tritt kein Fehler auf. Ich empfehle dringend, diese Compiler-Option zu aktivieren.

24
David Sherret 18 Jän. 2019 im 18:51

array.indexOf ist eine Funktion.

Funktionen sind Objekte.

Sie haben auf die Eigenschaft someObject der Funktion array.indexOf zugegriffen.

Du hättest undefined.

const array = [1, 2, 3]
const someObject = 'asdasd'

console.log(array.indexOf[someObject])
// undefined
6
0xc14m1z 18 Jän. 2019 im 13:54

Das einzige wirkliche Problem hierbei ist, dass Sie erwartet haben, dass Typescript einen Fehler auslöst, der das Problem in Ihrer Logik aufdeckt. Die beabsichtigte Logik bestand darin, geschweifte Klammern zu verwenden und die Funktion someArray.indexOf(someObject) zu verwenden.

Als Sie eckige Klammern someArray.indexOf[someObject] verwendeten, konvertierte die JS-Laufzeit Ihr Objekt someObject zuerst in eine Zeichenfolge, indem Sie die Funktion someObject.toString aufriefen, die höchstwahrscheinlich "[object object]" zurückgab. . Dann wurde das someArray.indexOf Objekt nach dem Schlüssel "[object object]" abgefragt, der nicht vorhanden war, und undefined zurückgegeben. Für Typescript ist dies völlig in Ordnung.

David Sherret wies darauf hin, dass --noImplicitAny auf den Fehler hingewiesen hätte, aber es hätte nur auf einen anderen Fehler hingewiesen, wie er erklärte, der Ihnen nicht direkt geholfen hätte, den Fehler in Ihrer Logik zu finden.

0
Alex Steinberg 18 Jän. 2019 im 23:13