TypeScript: Erstellen eines leeren typisierten Container-Arrays

179

Ich erstelle ein einfaches Logikspiel namens "Three of a Crime" in TypeScript.

Beim Versuch, ein typisiertes Array in TypeScript vorab zuzuweisen, habe ich Folgendes versucht:

var arr = Criminal[];

was den Fehler "Format des Ausdrucksbegriffs überprüfen" ergab.

versuchte es auch

var arr : Criminal = [];

und dies produzierte "kann keine [] in 'Criminal' konvertieren

Wie geht das mit TypeScript?

darethas
quelle

Antworten:

162

Bei den vorhandenen Antworten wurde eine Option übersehen. Hier ist eine vollständige Liste:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. Die explizite Angabe des Typs ist die allgemeine Lösung, wenn die Typinferenz für eine Variablendeklaration fehlschlägt.

  2. Der Vorteil der Verwendung einer Typzusicherung (manchmal als Umwandlung bezeichnet, in TypeScript jedoch nicht als Umwandlung) gilt für jeden Ausdruck, sodass sie auch dann verwendet werden kann, wenn keine Variable deklariert ist. Es gibt zwei Syntaxen für Typzusicherungen, aber nur letztere funktionieren in Kombination mit JSX, wenn Sie sich dafür interessieren.

  3. Die Verwendung des Array-Konstruktors hilft Ihnen nur in diesem speziellen Anwendungsfall, ist aber für mich persönlich am besten lesbar. Zur Laufzeit * gibt es jedoch leichte Auswirkungen auf die Leistung . Wenn jemand verrückt genug wäre, den Array-Konstruktor neu zu definieren, könnte sich die Bedeutung ändern .

Es ist eine Frage der persönlichen Präferenz, aber ich finde die dritte Option am besten lesbar. In den allermeisten Fällen wären die genannten Nachteile vernachlässigbar und die Lesbarkeit ist der wichtigste Faktor.

*: Lustige Tatsache; Zum Zeitpunkt des Schreibens betrug der Leistungsunterschied in Chrome 60%, während in Firefox kein messbarer Leistungsunterschied bestand.

Thorarin
quelle
60% ?? : O Das ist wild
Max Coplan
239

Das Problem der korrekten Vorbelegung eines typisierten Arrays in TypeScript war aufgrund der wörtlichen Syntax des Arrays etwas unklar, sodass es nicht so intuitiv war, wie ich zuerst dachte.

Der richtige Weg wäre

var arr : Criminal[] = [];

Dadurch erhalten Sie ein korrekt eingegebenes, leeres Array, das in der Variablen 'arr' gespeichert ist.

Hoffe das hilft anderen!

darethas
quelle
20

Ich weiß, dass dies eine alte Frage ist, aber ich hatte kürzlich ein ähnliches Problem, das auf diese Weise nicht gelöst werden konnte, da ich ein leeres Array eines bestimmten Typs zurückgeben musste.

ich hatte

return [];

wo []war Criminal[]typ.

Weder return: Criminal[] [];noch return []: Criminal[];für mich gearbeitet.

Auf den ersten Blick habe ich es gelöst, indem ich kurz vor der Rückgabe eine typisierte Variable erstellt habe (wie Sie richtig berichtet haben), aber (ich weiß nicht, wie JavaScript-Engines funktionieren) kann es zu Overhead kommen und es ist weniger lesbar.

Aus Gründen der Gründlichkeit werde ich diese Lösung auch in meiner Antwort angeben:

let temp: Criminal[] = [];
return temp;

Schließlich fand ich TypeScript-Typ-Casting, mit dem ich das Problem präziser und lesbarer (und möglicherweise effizienter) lösen konnte:

return <Criminal[]>[];

Hoffe das wird zukünftigen Lesern helfen!

Fylax
quelle
1

Für den öffentlichen Zugriff wie folgt verwenden:

public arr: Criminal[] = [];
rk13
quelle