Vyhledávání na webu

Přepínač Typescript enum přechází na výchozí místo na správný případ


Mám následující výčet:

enum EditMode {
    View = 0,
    Edit = 1,
    Delete = 2
}

Předpokládejme, že mám proměnnou typu výčtu

var editMode = EditMode.Edit;

Proč následující kód nefunguje (jde rovnou do default)?

switch (editMode) {
    case EditMode.Delete:
        // ...
        break;
    case EditMode.Edit:
        // ...
        break;
    default:
        // ...
        break;
}

Odpověď č. 1

Také jsem měl tento problém. Snadný způsob, jak se tomu vyhnout: přidejte před svou proměnnou ve switch + znak, tj.

switch (+editMode) {
    case EditMode.Delete:
        ...
        break;
    case EditMode.Edit:
        ...
        break;
    default:
        ...
        break;
    }

Odpověď č. 2

Zjistil jsem, proč se to děje: někde v kódu je aktivační funkce (používám Durandal), která předává tento výčet jako řetězec (funkce má parametr označený jako výčet, ale přesto je to řetězec). Proto moje příkaz switch selhává.

Jednoduše jsem hodnotu převedl na číslo a teď vše funguje podle očekávání.

Odpověď č. 3

Problém zde souvisí s (číselnými) literálovými typy v TypeScriptu. Když provedete toto přiřazení:

var editMode = EditMode.Edit

TypeScript vyhodnocuje typ jako:

var editMode: 1 = EditMode.Edit

Nyní, když porovnáte hodnotu, o které TypeScript ví, že musí být 1 (EditMode.Edit), s hodnotou, o které ví, že musí být 0 (EditMode.View), považuje to všechno za porušení bezpečnosti typů. Kdyby proměnná editMode nebyla enum, TypeScript by se pouze stěžoval, ale protože je to enum, který ve skutečnosti v JavaScriptu neexistuje, TypeScript má kontrolu nad transpilačním procesem takovým způsobem, že skutečně vyhodí chybu.
Takže máte 2 možnosti. Můžete buď přinutit editMode, aby bylo number, nebo aby bylo EditMode (tj. jakákoli hodnota, kterou EditMode může být, ne jen ta, která je přiřazena proměnné editMode).
Osobně preferuji přinutit ho, aby bylo EditMode, protože to působí více typově bezpečně.

Pokud chcete jít cestou čísla, můžete udělat následující, což bylo již dříve zmíněno:

switch(+editMode)

Chcete-li zvolit cestu EditMode (což doporučuji), můžete ji předat funkci, jak bylo zmíněno, ale někdy je trochu čistší nenapsat funkci. Pokud je tomu tak i zde, můžete opět vynutit typ v příkazu switch:

switch(editMode as EditMode)

Dělej, co preferuješ, ale mně se jednoduše líbí jasnost výslovného uvedení „tato proměnná je považována za EditMode“ na rozdíl od „tato proměnná by měla být ve skutečnosti number, ne Enum“.

Odpověď č. 4

Změňte definici vašeho výčtu EditMode na:

enum EditMode {
    View = "View",
    Edit = "Edit",
    Delete = "Delete"
}

Odpověď č. 5

Verze TypeScriptu 3.7.5

tenhle kód mi fungoval

enum Seasons {
    Winter,
    Spring,
    Summer,
    Autum
  }

switch (+Seasons.Winter) {
    case Seasons.Winter:
        console.log('weather is cold');
        break;
    case Seasons.Spring:
        console.log('weather is spring');
        break;
    case Seasons.Summer:
        console.log('weather is summer');
        break;
    default:
        break;
}

nebo můžete deklarovat konstantu a použít ji jako parametr pro příkaz switch

const season: Seasons = Seasons.Winter
switch (+season) {
    case Seasons.Winter:
        console.log('weather is cold');
        break;
    case Seasons.Spring:
        console.log('weather is spring');
        break;
    case Seasons.Summer:
        console.log('weather is summer');
        break;
    default:
        break;
}

Související články