2017-06-27 7 views

Antwort

3

Fluss-Typ-Verfeinerungen sind konservativ. Dies bedeutet, dass es invalidates them aggressiv ist, wenn es nicht sicher sein kann, dass sie halten werden.

In diesem Fall sieht Flow, dass a neu zugewiesen wurde, sodass es nicht null/undefined sein muss. Allerdings ist es nicht die Analyse zu wissen, dass ist immer wird null/undefined sein - soweit es hier weiß, könnte einige spätere Zuordnung zu null/undefined neu zuweisen.

Es ist auch nicht bekannt, wann der an .then übergebene Rückruf aufgerufen wird. Daher macht es konservativ die Verfeinerung ungültig.

Beachten Sie, dass dieses Problem nicht spezifisch für Promise s ist. Dies geschieht immer dann, wenn auf eine nicht-konstante Variable eine Verfeinerung angewendet wird und diese später in einem Abschluss verwendet wird. Innerhalb der Schließung wird die Verfeinerung fallengelassen.

Die einfache Problemumgehung besteht darin, const zu verwenden. Dann weiß Flow, dass eine angewendete Typverfeinerung immer gültig ist, da die Variable niemals neu zugewiesen werden kann:

-2

"Eigenschaft kann nicht auf möglicherweise undefinierten zugegriffen werden", dass, weil in der Funktionsdefinition ist Sie haben:

function f(a ?: Array<string>) {

das bedeutet, a ‚s Art ist ein Array von Strings , aber es ist nullbar (?:). Ihr Wert kann null (oder undefiniert) sein.

Obwohl aus Ihrem Code ist offensichtlich, dass a durch ein leeres Array überschrieben wird, wenn seine null (oder undefined). Aber sein Typ bleibt immer noch ein nullbares Array von Strings.

Wenn der Compiler versucht, diese Zeile zu kompilieren:

.then(() => a.map) // THROWS, WHY?

es denkt, dass a null sein könnte (oder nicht definiert ist) und beschwert sich so mit einem Fehler.

Wenn Sie das Fragezeichen ? in Ihrem Funktionsparameter Typ entfernen, weiß der Compiler, dass a nicht null sein kann und somit es funktioniert!

PS: Bei Bedarf können Sie a = a || []; in die Funktion verschieben, die die Funktion f aufruft.

+3

Nein; Der Fluss ist intelligent genug, um zu wissen, dass "a = a || []; 'verfeinert den Typ von' a' um nicht mehr 'null' zu enthalten. Deshalb ist die erste 'a.map' in Ordnung. Das Problem ist, dass diese Flow-Analyse keine Verschlüsse enthält. – SLaks

Verwandte Themen