2017-02-21 3 views
5

Ich frage mich, wie man diese zahlreichen Null-Checks vermeiden oder zumindest verstehen, was der Punkt ist, weil es kontraproduktiv scheint.Flowtype, die ständig Null-Checks erfordert

Flowtype ist mir ein Fehler dafür geben, wenn ich die NULL-Prüfung auslassen:

var myEl = new MyElement() 
if (document.body != null) { // error on next line if omitted 
    document.body.appendChild(myEl) 
} 

ich in jedem einzelnen Rückruf, der NULL-Prüfung für das Dokument Körper zu tun haben, auch, denn wer weiß, vielleicht der Körper ist hier null richtig ?! Ich denke, das ist totaler Overkill. Nicht nur das, aber was ist der Sinn eines so einfachen Null-Checks? Es wird einfach einen wichtigen Teil des Programms überspringen und unbestimmtes Verhalten an anderer Stelle zeigen und das Debuggen der App um vieles schwieriger machen. Ich würde wirklich lieber nur eine Null-Ausnahme an dieser Stelle, wenn ein Fehler jemals hier passiert, denn um wirklich sicher zu sein, dieses kleine 2-Zeilen-Code-Segment, das ich in Javascript schreiben würde wie folgt in FlowType:

Also 4 zusätzliche Codezeilen und einige Verschachtelung nur um etwas zu verfolgen, was ich kostenlos bekommen würde, wenn ich nur die App in einen Fehler laufen lassen würde. Und ich brauche diese 4 Zeilen für jeden einzelnen QuerySelector. Auf jedem einzelnen Dokument. Auf jeden einzelnen getElementByTagName. Dies allein erhöht wahrscheinlich meine gesamte Codebasis um 10%. Was ist der Zweck, dies so streng durchzusetzen?

In anderen Sprachen wäre ich auch in der Lage zu versuchen, diese Hotspots allmählich nach Bedarf zu fangen, Flow lässt mich das auch nicht tun. Es zeigt Fehler an, ob ich einen try-catch hinzufüge oder nicht.

+0

Sie können 'if (! Document.body) werfen neue Error();', anstelle von 'if/else' und so. Am Ende des Tages macht Flow hier seine Arbeit, was 100% Laufzeitfehler vermeidet, die vom Zeitsystem abgefangen werden können. 'try/catch' dient zum Einfangen expliziter Ausnahmen, aber' Null'-Prüfungen liegen in der Verantwortung des Typsystems. Einige Sprachen erlauben es, Flow dagegen nicht. – loganfsmyth

+0

@Blub meine Frage, was ist der Flowtype-Fehler? Das kann bei der Beantwortung hilfreich sein. Es könnte sich lohnen zu beachten, dass Flowtype als ein Maybe-Typ behandelt werden kann, so dass es nicht immer nur das JavaScript-Null ist. –

+0

@KevinTomiyoshiYang-Datei: '[flow] Aufruf der Methode 'appendChild' (Methode kann möglicherweise nicht auf null-Wert aufgerufen werden)' – Blub

Antwort

7

Mithilfe eines Typprüfers entscheiden Sie sich für die erzwungenen Regeln. Der Zugriff auf eine Eigenschaft mit einem Nullwerttyp ist eine dieser Einschränkungen. Wenn Sie also Ausnahmen für Nullwerte haben wollen, müssen Sie explizit werfen, um Flow zu beweisen, dass es das ist, was Sie wollen. Sie könnten zum Beispiel ein Modul wie

if (!document.body) throw new Error("Unexpectedly missing <body>."); 
export const body: HTMLElement = document.body; 

export function querySelector(el: HTMLElement, selector: string): HTMLElement { 
    const result = el.querySelector(selector); 
    if (!result) throw new Error(`Failed to match: ${selector}`); 
    return result; 
} 

Durch das Werfen machen, diese Funktionen ausdrücklich sagen, in allen Fällen „Ich ein Element zurückkehren wird“, und in null Fällen werden sie Ausnahmen werfen.

Dann in Ihrem normalen Code, werden Sie garantiert Sie diejenigen

import {body, querySelector} from "./utils"; 

body.appendChild(document.createElement('div')); 

querySelector(body, 'div').setAttribute('thing', 'value'); 

und es wird typecheck Eigenschaft nutzen können.

+2

Beachten Sie auch, dass Flow special-cases den' invarianten' Namen. Sie können 'invariant von' assert' importieren oder anderweitig eine Implementierung für 'invariant' bereitstellen und dann können Sie einfach 'invariant (document.body)' anstatt die 'if' /' throw' Zeile schreiben, die Sie gefunden haben. Es ist schneller zu schreiben und IMO liest es besser. –

Verwandte Themen