Typoskript herausfiltern, die null-Werte aus einem array
Typoskript, --strictNullChecks-Modus.
Angenommen ich habe ein array der null-Zeichenfolgen (string | null)[]. Was wäre ein single-Ausdruck Weg, um entfernen Sie alle null-Werte in einer solchen Weise, dass das Ergebnis hat den Typ " string[]?
const array: (string | null)[] = ["foo", "bar", null, "zoo", null];
const filterdArray: string[] = ???;
Array.filter funktioniert hier nicht:
//Type '(string | null)[]' is not assignable to type 'string[]'
array.filter(x => x != null);
Array Verstehens könnten schon arbeiten, aber Sie werden nicht unterstützt von Typoskript.
Eigentlich die Frage, kann verallgemeinert werden, um das problem der Filterung ein array von union-Typ durch entfernen der Einträge mit einem bestimmten Typ von der union. Aber konzentrieren wir uns auf die Gewerkschaften, die mit null-und vielleicht undefiniert wie diese sind die häufigsten usecases.
- Was ist das problem über die Iteration über das array, zu überprüfen, ob er index null ist, und wenn nicht, indem Sie Sie auf das gefilterte array?
- Iteration+wenn+einfügen ist das, was ich jetzt tun soll. Ich finde es zu wortreich.
- Auf dem Spielplatz, es funktioniert Super mit
array.filter
den Weg, den Sie geschrieben. Es braucht nicht einmal die: string[]
, das ist genug:const filterdArray = array.filter(x => x != null);
und der compiler folgert, dassfilterdArray
ist der Typstring[]
. Welche version von typescript verwenden Sie? - In der playground wählen Sie Optionen aus und aktivieren Sie strictNullChecks
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eine Typ-Prädikat Funktion in der
.filter
zu vermeiden opting out-of-strenge Typ-Prüfung:Alternativ können Sie
array.reduce<string[]>(...)
.value !== null && value !== undefined
nicht gehen, um einen string zurückgeben, es wird zu true oder false zurück. Plus, übergeben Sie eine null oder undefined, gibt Sie einen Wert, der null ist oder nicht definiert ist, so dass es nicht wirklich beschränken. Das problem ist, dass diese Funktion nicht das, was eigentlich die Filterung es kann also nicht wirklich die Garantie.notEmpty
garantieren, dass es schränkt die Art vonstring|null
nach unten zustring
? Nicht wirklich. Die Gewissheit, dass Sie bekommen mit Typ-Prädikate, ist, dass, wenn es die falsche Art, Sie werden nicht in der Lage zur Verwendung in einem filter, der ist noch nützlich, denn Sie können ganz einfach füllen Sie die Lücke mit nur ein paar unit-tests. Unit-test die definition und der Gebrauch ist bedeckt durch das Typ-system.Ähnlich wie @bijou-trouvaille Antwort, Sie brauchen nur zu erklären, dass die
<arg> is <Type>
als der Ausgang der filter-Funktion:Können Sie werfen Sie Ihre
filter
Ergebnis in den Typ Sie möchten:Dies funktioniert für die mehr Allgemeinen Gebrauch den Fall, dass Sie erwähnt, zum Beispiel:
(code im playground)
Ich glaube, Sie haben es alle gut, außer, dass der Typ-überprüfung macht nur die gefilterten Art nicht anders sein, als der Rückgabetyp.