2015-07-24 5 views
10

Von Zeit zu Zeit bekomme ich TSLint Fehler "Block ist leer". Dies geschieht z.B. wenn ich einen no-op Rückruf an eine Funktion:Warum melden TSLint und JSLint leere Blöcke?

doSomething(() => {}); 

Von dem, was ich lese, tut JSLint anscheinend die gleichen, aber das habe ich nicht überprüfen.

Ich finde diese Verwendungen vollständig gültig, also habe ich versucht, einen Grund zu finden, warum leere Blöcke überhaupt als schlecht angesehen werden. Aber das einzige, was ich finden kann (z. B. in this answer) sind Anweisungen zum Hinzufügen eines return;, um den Fehler zu vermeiden. Das ist nicht was ich in jedem leeren Rückruf tun möchte.

Warum meldet TSLint oben leeren Block als Problem? Gibt es einen Grund, warum ich den Check nicht deaktivieren sollte?

+0

Nie auch benutzt; nur laut denken: könnte es sein, dass die Zeiten, die TSLint beschwert, wenn es denkt, dass die Funktion _should_ einen Wert zurückgibt und Ihre No-Op-Funktion dies nicht tut? Sie könnten vielleicht eine explizite No-Op-Funktion definieren und einfach ihren Namen in dieser Art von Anruf übergeben. – TripeHound

+0

@TripeHound Nein, TSLint beschwert sich, wenn ich einen expliziten Typ von '(() => void)' für den Callback spezifiziere. Bezüglich des Noop: Ich habe gerade herausgefunden, dass lodash bereits eins definiert: '_noop'.Dies ist bisher die sauberste Lösung ... – theDmi

+0

Sie können die '{}' auch in Klammern einschließen, z. '() => ({})' verursacht nicht die Warnung "leerer Block" mit TSLint – danwellman

Antwort

21

Warum TSLint Bericht über leeren Block als Problem

Fehler zu vermeiden. Vielleicht wurde die Funktion vergessen, ausgefüllt zu werden. Empfehlen Sie () => undefined als Noop.

Mehr

Wenn Sie es einfach "no-empty": false, zu Ihrem tslint.json hinzufügen deaktivieren möchten (global deaktivieren) oder Inline deaktivieren Sie einen /* tslint:disable:no-empty */ Kommentar verwenden.

+0

Ich glaube, ich möchte nicht, dass TSLint mir sagt, dass ich es verpasst habe, einen Funktionskörper zu füllen, dafür habe ich Tests. Also, wenn es wirklich nichts anderes gibt, für das diese Überprüfung nützlich ist, dann deaktiviere ich es lieber, als '() => undefined' in jedem einzelnen Callback zu verwenden. Aber das ist Geschmackssache, nehme ich an. – theDmi

+0

Nur zur Klarstellung, könnten Sie genau angeben, was Sie mit "Fehlern" genau meinen? Ist es nur der leere Funktionskörper? – theDmi

+0

Wie Basarat sagte, ein Fehler könnte sein, dass Sie vergessen haben, etwas zu implementieren, obwohl konventionell jede Funktion, die Sie eines Tages umsetzen möchten, "NotImplemented" werfen sollte, wenn sie verwendet wird. – MikeSW

10

Wie bei allen Überprüfungen haben Sie das ultimative Urteil darüber, ob sie Ihnen helfen oder nicht. Sie können diese TSLint-Prüfung mit einer der folgenden Optionen abschalten.

Deaktivieren Sie die Regel in tslint.json

//... 
"no-empty": false, 
//... 

Deaktivieren Sie die Regel in der Datei:

/* tslint:disable:no-empty */ 

Sie können es immer wieder zurückkehren, wenn irgendwann in der Zukunft einen leeren Block finden Das hat dich ein Problem verursacht.

+1

Dies sollte die akzeptierte Antwort sein. – sss4r

0

Wenn Sie glauben, Sie nicht wollen, verwenden Rückruf bei bestimmten Szenarien Sie den Code ändern können

von

doSomething(() => {}); 

zu

doSomething(() => void); 

Substituieren() => {} zu Das bedeutet, dass Sie sich nicht um diesen Rückruf kümmern. und explizite Typumwandlung vermeidet Implikationen.

Viel Glück.