Pregunta

Estoy trabajando en un archivo de definiciones para la API de Google Maps para TypeScript.

Y necesito definir un tipo de enumeración, por ejemplo. google.maps.Animation que contiene dos propiedades: BOUNCE y DROP.

¿Cómo se debe hacer esto en TypeScript?

¿Fue útil?

Solución

TypeScript 0.9+ tiene una especificación para enumeraciones:

enum AnimationType {
    BOUNCE,
    DROP,
}

La coma final es opcional.

Otros consejos

A partir de TypeScript 0.9 (actualmente una versión alfa), puede usar la definición de enumeración de esta manera:

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;

De forma predeterminada, a estas enumeraciones se les asignará 0, 1 y 2 respectivamente.Si desea establecer explícitamente estos números, puede hacerlo como parte de la declaración de enumeración.

Listado 6.2 Enumeraciones con miembros explícitos

enum TShirtSize {
  Small = 3,
  Medium = 5,
  Large = 8
}

var mySize = TShirtSize.Large;

Ambos ejemplos surgieron directamente de TypeScript para programadores de JavaScript.

Tenga en cuenta que esto es diferente a la especificación 0.8. La especificación 0.8 tenía este aspecto, pero estaba marcada como experimental y probablemente cambiaría, por lo que tendrás que actualizar cualquier código antiguo:

Descargo de responsabilidad - este ejemplo 0.8 no funcionaría en las versiones más recientes del compilador TypeScript.

enum TShirtSize {
  Small: 3,
  Medium: 5,
  Large: 8
}

var mySize = TShirtSize.Large;

Esto ahora es parte del idioma.Ver TypeScriptLang.org > Tipos básicos > enumeración para la documentación sobre esto.Un extracto de la documentación sobre cómo utilizar estas enumeraciones:

enum Color {Red, Green, Blue};
var c: Color = Color.Green;

O con números de respaldo manuales:

enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;

También puede volver al nombre de la enumeración usando, por ejemplo Color[2].

A continuación se muestra un ejemplo de cómo funciona todo esto:

module myModule {
    export enum Color {Red, Green, Blue};

    export class MyClass {
        myColor: Color;

        constructor() {
            console.log(this.myColor);
            this.myColor = Color.Blue;
            console.log(this.myColor);
            console.log(Color[this.myColor]);
        }
    }
}

var foo = new myModule.MyClass();

Esto registrará:

undefined  
2  
Blue

Porque, al momento de escribir esto, Typecript Playground generará este código:

var myModule;
(function (myModule) {
    (function (Color) {
        Color[Color["Red"] = 0] = "Red";
        Color[Color["Green"] = 1] = "Green";
        Color[Color["Blue"] = 2] = "Blue";
    })(myModule.Color || (myModule.Color = {}));
    var Color = myModule.Color;
    ;
    var MyClass = (function () {
        function MyClass() {
            console.log(this.myColor);
            this.myColor = Color.Blue;
            console.log(this.myColor);
            console.log(Color[this.myColor]);
        }
        return MyClass;
    })();
    myModule.MyClass = MyClass;
})(myModule || (myModule = {}));
var foo = new myModule.MyClass();

Sólo otra nota de que puedes hacer una enumeración de ID/cadena con lo siguiente:

class EnumyObjects{
    public static BOUNCE={str:"Bounce",id:1};
    public static DROP={str:"Drop",id:2};
    public static FALL={str:"Fall",id:3};


}

Actualizar:

Como señaló @iX3, Texto mecanografiado 2.4 tiene soporte para cadenas de enumeración.

Ver:Crear una enumeración con valores de cadena en Typecript


Respuesta original:

Para los valores de miembros de cadena, TypeScript solo permite números como valores de miembros de enumeración.Pero hay algunas soluciones/trucos que puedes implementar;

Solución 1:

copiado de: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/

Existe una solución simple:Simplemente envíe la cadena literal a cualquiera antes de asignar:

export enum Language {
    English = <any>"English",
    German = <any>"German",
    French = <any>"French",
    Italian = <any>"Italian"
}

solución 2:

copiado de: https://basarat.gitbooks.io/typescript/content/docs/types/literal-types.html

Puede utilizar un literal de cadena como tipo.Por ejemplo:

let foo: 'Hello';

Aquí hemos creado una variable llamada foo que solo permitirá asignarle el valor literal 'Hola'.Esto se demuestra a continuación:

let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"

No son muy útiles por sí solos, pero se pueden combinar en una unión de tipos para crear una abstracción poderosa (y útil), por ejemplo:

type CardinalDirection =
    "North"
    | "East"
    | "South"
    | "West";

function move(distance: number, direction: CardinalDirection) {
    // ...
}

move(1,"North"); // Okay
move(1,"Nurth"); // Error!

Enumeraciones mecanografiadas:

Las enumeraciones se colocan en lenguaje mecanografiado para definir un conjunto de constantes con nombre.Usar enumeraciones puede hacernos la vida más fácil.La razón de esto es que estas constantes suelen ser más fáciles de leer que el valor que representa la enumeración.

Creando una enumeración:

enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

Este ejemplo de los documentos mecanografiados explica muy bien cómo funcionan las enumeraciones.Observe que nuestro primer valor de enumeración (Arriba) se inicializa con 1.Todos los siguientes miembros de la enumeración numérica son entonces incrementado automáticamente de este valor (es decirAbajo = 2, Izquierda = 3, Derecha = 4).Si no inicializamos el primer valor con 1, la enumeración comenzaría en 0 y luego se incrementaría automáticamente (es decir,Abajo = 1, Izquierda = 2, Derecha = 3).

Usando una enumeración:

Podemos acceder a los valores de la enumeración de la siguiente manera:

Direction.Up;     // first the enum name, then the dot operator followed by the enum value
Direction.Down;

Fíjate que así somos mucho más descriptivo en la forma en que escribimos nuestro código.Las enumeraciones básicamente nos impiden usar numeros magicos (números que representan alguna entidad porque el programador les ha dado un significado en un contexto determinado).Los números mágicos son malos por las siguientes razones:

  1. Necesitamos pensar más, primero debemos traducir el número a una entidad antes de poder razonar sobre nuestro código.
  2. Si revisamos nuestro código después de un largo tiempo, u otros programadores revisan nuestro código, no necesariamente saben qué significan estos números.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top