Pesquisa de site

qual é a importância do enum em TypeScript


qual é o uso de enum no TypeScript. Se o propósito dele é apenas tornar o código legível, não podemos apenas usar constantes para o mesmo propósito

enum Color {
Red = 1, Green = 2, Blue = 4
};


let obj1: Color = Color.Red;
obj1 = 100; // does not show any error in IDE while enum should accept some specific values

Se não há vantagem em fazer a verificação de tipo, não poderia simplesmente ser escrito como.

const BasicColor = {
    Red: 1,
    Green: 2,
    Blue: 4
};

let obj2 = BasicColor.Red;

Resposta #1

Primeiro, no seguinte:

const BasicColor = {
    Red: 1,
    Green: 2,
    Blue: 4
};

Vermelho, Verde e Azul ainda são mutáveis (enquanto que não são em um enum).

Enums também fornecem algumas coisas:

  1. um conjunto fechado de valores bem conhecidos (que não permitirá erros de digitação mais tarde), cada um dos quais tem...
  2. um conjunto respectivo de tipos semelhantes a literais para cada membro, todos os quais são fornecidos...
  3. por um único tipo nomeado que abrange todos os valores

Para conseguir isso com algo como um namespace, por exemplo, você tem que fazer algo como

export namespace Color
    export const Red = 1
    export type Red = typeof Red;

    export const Green = 2;
    export type Green = 2;

    export const Blue = 3;
    export type Blue = typeof Blue;
}
export type Color = Color.Red | Color.Blue | Color.Green

O que você também está observando é um comportamento legado infeliz em que o TypeScript permite a atribuição de qualquer valor numérico a um enum numérico.

Mas se você estiver usando um enum de string, você não terá esse comportamento. Existem também outras coisas, como a verificação de exaustividade, que você pode habilitar com enums de união:

enum E {
  Hello = "hello",
  Beautiful = "beautiful",
  World = "world"
}

// if a type has not been exhaustively tested,
// TypeScript will issue an error when passing
// that value into this function
function assertNever(x: never) {
  throw new Error("Unexpected value " + x);
}

declare var x: E;
switch (x) {
  case E.Hello:
  case E.Beautiful:
  case E.World:
    // do stuff...
    break;
  default: assertNever(x);
}

Artigos relacionados