Hvordan lage enum som type i typescript?

stemmer
87

Jeg jobber med en definisjonsfilen for Google Maps API for typescript.

Og jeg trenger å definere en enum som typen f.eks. google.maps.Animationsom inneholder to egenskaper: BOUNCEog DROP.

Hvordan skal dette gjøres i Loggfila?

Publisert på 02/10/2012 klokken 09:29
kilden bruker
På andre språk...                            


6 svar

stemmer
107

Maskinskrevet manuskript 0.9+ har en spesifikasjon for enums:

enum AnimationType {
    BOUNCE,
    DROP,
}

Den endelige komma er valgfritt.

Svarte 02/10/2012 kl. 09:45
kilden bruker

stemmer
57

Per Loggfila 0,9 (for tiden en alpha release) kan du bruke enum definisjon som dette:

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;

Som standard, vil disse enumerations bli tildelt henholdsvis 0, 1 og 2. Hvis du ønsker å eksplisitt sette disse tallene, kan du gjøre det som en del av enum erklæringen.

Oppføring 6.2 Oppramsinger med eksplisitte medlemmer

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

var mySize = TShirtSize.Large;

Begge disse eksemplene løftet direkte ut av typescript for Javascript programmerere .

Merk at dette er forskjellig fra 0,8-spesifikasjonen. Den 0.8-spesifikasjonen så ut som dette - men det var merket som eksperimentell og sannsynligvis endres, slik at du må oppdatere gamle koden:

Ansvarsfraskrivelse - dette 0,8 eksempel ville bli brutt i nyere versjoner av Loggfila kompilatoren.

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

var mySize = TShirtSize.Large;
Svarte 02/10/2012 kl. 09:40
kilden bruker

stemmer
21

Dette er nå en del av språket. Se TypeScriptLang.org> grunnleggende typer> enum for dokumentasjon på dette. Et utdrag fra dokumentasjon om hvordan du bruker disse enums:

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

Eller med manuelle backing tall:

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

Du kan også gå tilbake til enum navn ved å bruke for eksempel Color[2].

Her er et eksempel på hvordan dette går sammen:

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();

Dette vil log:

undefined  
2  
Blue

Fordi, på tidspunktet for å skrive dette, vil Loggfila barn generere denne koden:

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();
Svarte 17/08/2015 kl. 13:23
kilden bruker

stemmer
14

Bare et annet merke som du kan en id / string enum med følgende:

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


}
Svarte 04/10/2012 kl. 23:29
kilden bruker

stemmer
6

oppdatering :

Som det fremgår av @ iX3, Loggfila 2.4 har støtte for USB strenger.

Se: Opprett en enum med strengverdier i Loggfila


Original svar:

For String medlems verdier, Loggfila tillater bare tall som enum medlems verdier. Men det finnes noen løsninger / hacks du kan implementere;

Løsning 1:

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

Det er en enkel løsning: Bare kaste strenglitteral til noen før du tilordner:

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

Løsning 2:

kopiert fra: https://basarat.gitbooks.io/typescript/content/docs/types/literal-types.html

Du kan bruke en streng bokstavelig som en type. For eksempel:

let foo: 'Hello';

Her har vi laget en variabel kalt foo som bare vil tillate den bokstavelige verdi 'Hei' til å bli tildelt. Dette er vist nedenfor:

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

De er ikke veldig nyttig på egenhånd, men kan kombineres i en type union å skape en kraftig (og nyttig) abstraksjon f.eks:

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

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

move(1,"North"); // Okay
move(1,"Nurth"); // Error!
Svarte 22/11/2016 kl. 11:30
kilden bruker

stemmer
1

Enums i Loggfila:

Enums er satt inn i Loggfila språket til å definere et sett med navngitte konstanter. Bruke enums kan gjøre livet enklere. Grunnen til dette er at disse konstantene er ofte lettere å lese enn verdien som enum representerer.

Opprette en enum:

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

Dette eksemplet fra Loggfila docs forklarer veldig pent hvordan enums fungere. Legg merke til at vår første enum verdi (Up) er initialisert med 1. Alle følgende medlemmer av antall enum er da automatisk økes fra denne verdien (dvs. ned = 2, Venstre = 3, Høyre = 4). Hvis vi ikke initialisere den første verdien med en enum starter på 0 og deretter auto tilvekst (dvs. ned = 1, Venstre = 2, Høyre = 3).

Bruke en enum:

Vi kan få tilgang til verdiene av enum på følgende måte:

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

Legg merke til at denne måten er vi mye mer beskrivende i måten vi skriver vår kode. Enums utgangspunktet hindre oss fra å bruke magiske tall (tall som representerer noen entitet fordi programmereren har gitt mening til dem i en viss sammenheng). Magiske tallene er dårlig på grunn av følgende årsaker:

  1. Vi må tenke hardere, må vi først oversette nummeret til en enhet før vi kan resonnere om vår kode.
  2. Hvis vi gjennom vår kode etter en lang stund, eller andre programmerere gjennom vår kode, har de ikke nødvendigvis vet hva som menes med disse tallene.
Svarte 15/11/2018 kl. 21:00
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more