Fehler beim Duplizieren der Const-Deklaration in der Switch-Case-Anweisung

78

Ich habe den folgenden Code und erhalte die Fehlermeldung 'Duplicate Declaration query_url'.

  switch(condition) {
    case 'complex':
      const query_url = `something`;
      break;
    default:
      const query_url = `something`;
      break;
  }

Ich verstehe, dass query_url zweimal deklariert wird, was nicht richtig ist. Aber ich weiß nicht, wie ich das lösen soll. Kann mir bitte jemand helfen, wie dies richtig funktionieren soll?

Asanas
quelle
4
Wo müssen Sie verwenden query_url?
Bergi
2
Wenn Sie query_urlaußerhalb der switchAnweisung verwenden müssen, können Sie nicht verwenden const.
Felix Kling
Siehe @Bergi Antwort für die nützlichste Antwort (nicht sicher, warum es in der Liste versteckt ist, wenn es bei weitem die meisten Upvotes hat)
oldo.nicho
@ oldo.nicho Weil es nicht als Antwort akzeptiert wurde
Moose on the Loose

Antworten:

10

Wenn Sie jeweils dieselbe Variable neu deklarieren müssen, lesen Sie die Antwort von @Bergi unten

Wenn query_urlje nach Switch-Zweig mehrere Werte vorliegen können, benötigen Sie offensichtlich eine Variable (entweder mit varoder deklarieren let).

const wird einmal gesetzt und bleibt so.

Beispiel Verwendung mit let

let query_url = '';
switch(condition) {
  case 'complex':
    query_url = `something`;
    break;
  default:
    query_url = `something`;
    break;
}
eltonkamami
quelle
15
Einfach nicht wahr. check @bergi Antwort.
Kuf
4
@eltonkamami Obwohl ich nicht der Meinung bin, dass Ihre Antwort eine Abwertung verdient, da sie die Frage richtig anspricht, frage ich mich, warum Sie eine Variable in einem Switch-Fall deklarieren und erwarten würden, sie außerhalb dieses Bereichs zu verwenden.
Toddg
3
Siehe @Bergi Antwort unten
oldo.nicho
2
@eltonkamami die Antwort ist ausreichend. In der Frage wird gefragt, wie doppelte Definitionsfehler vermieden werden können. Betrachten Sie den Fall, in dem der Wert query_urlan eine andere Funktion übergeben wurde. In diesem Fall spielt es keine Rolle, dass query_urles sich um einen Blockbereich handelt, da es sich lediglich um einen Zwischenwert handelt. Sie sind unangemessen hart.
Patrick Michaelsen
328

Versuchen Sie, die Fälle in Blöcke zu verpacken:

switch(condition) {
  case 'complex': {
    const query_url = `something`;
    … // do something
    break;
  }
  default: {
    const query_url = `something`;
    … // do something else
    break;
  }
}
Bergi
quelle
7
Nicht sicher, warum dies herabgestuft wurde, es behebt den Fehler?
Bergi
1
Ähm, beschränken Sie sich nicht query_urlauf den Block, in dem er definiert ist. Welche Art von Niederlage besiegt den gesamten Zweck der Zuweisung?
3
@torazaburo: Ja, es darf nur in diesem Block verwendet werden. Ich bin mir nicht sicher, was der eigentliche Zweck des Codes ist. Sie sollten nicht switchnur a verwenden, um einen einzelnen Wert auszuwählen. Eine Objekt- (oder Map) Suche ist für diese Aufgabe besser geeignet.
Bergi
7
verblüfft. Ich betrachtete caseals Block. Danke für diesen Hinweis!
Andreyco
3
Danke ! Dies ist die wirkliche Lösung. Da Sie in diesem trivialen Fall eindeutig eine globale Variable definieren können, kann die globale Variable in einem komplexeren Fall in den meisten Switch-Zweigen unsinnig sein.
Emrys Myrooin
14

Ich persönlich bevorzuge (und neige dazu, dies zu missbrauchen) in solchen Fällen:

const query_url = (()=>
{
     switch(condition)
           case 'complex': return 'something';
           default       : return 'something-else';
})();

(Dies erfordert jedoch ES6 oder die Deklaration von "use-strict" in Node 4.x)

Update: Alternativ viel kompakter, je nachdem, ob es eine Logik gibt oder ob es sich um eine einfache Aufgabe handelt:

const query_url = {complex : 'something'}[condition] || 'something-else';

Dies hängt natürlich auch von der Menge an externer Logik ab, die in diesen switch-Anweisungen eingebettet ist!

rob2d
quelle
2
const query_url={
  complex:'something complex',
  other:'other thing'
}[condition]

Der Nachteil ist, dass Sie mit dem Objekt keine Standardeinstellung haben können. Sie müssen zusätzlich die Bedingung überprüfen.

sbk201
quelle
2

Sie können verwenden, {}um Ihren Schalterfall zu erfassen.

Für Ihren Fall müssen Sie die Variable zurückgeben, solange die Variable vorhanden ist und zwischen geschweiften Klammern verfügbar ist:

 switch(condition) {
    case 'complex': {
      const query_url = `something`;
      return query_url;
    }
    default: {
      const query_url = `something`;
      return query_url;
    }
  }

Wenn Sie nicht verwendenreturn , müssen Sie eine let query_urlüber Ihrer switch-Anweisung deklarieren .

Entstellen
quelle
1

Fügen Sie einfach switcheine Funktion mit einigen return-Anweisungen ein:

var condition;
function aSwitch(condition){
switch(condition) {
    case 'complex':
      return 'something';
    default:
      return 'something';
  }
}
const query_url = aSwitch(condition);
Zakaria
quelle
Wenn Sie dies nicht tun, werden "use strict";einige seltsame Dinge mit Ihrem Code auftreten. Jede return-Anweisung erstellt / verknüpft eine globale Variablenabfrage-URL.
eltonkamami
@antoniskamamis bearbeitet. Danke für den Tipp :)
Zakaria
Sie müssen nur den Wert ohne eine Zuweisung zurückgeben, die entweder eine globale oder einen Fehler verursacht
eltonkamami