Enum inne i klasse (TypeScript definisjonsfil)


Jeg har lett rundt, men ser ikke ut til å finne et svar på dette, forhåpentligvis kan du hjelpe.

Hvordan kan jeg legge til en enum til Image? Dette er hva jeg ideelt sett skulle ønske, men jeg får en feil.

declare module 'Lib' {
  export module Graphics {
    export class Image {
      enum State {}

      static STATE_IDLE: State;
      static STATE_LOADING: State;
      static STATE_READY: State;
      static STATE_ERROR: State;
      constructor();
    }
  }
}

Hvis jeg flytter State inn i Graphics-modulen fungerer det, men nå tilhører State Graphics, noe som er feil. Det må være en del av Image.

Svar #1

Jeg tror følgende er en forbedring av KoenTs løsning:

export class Image
{
    constructor ()
    {
        this.state = Image.State.Idle;
    }

    state: Image.State;
}

export namespace Image
{
    export enum State
    {
        Idle,
        Loading,
        Ready,
        Error
    }
}

Fordelen er at du kan utnytte navngitte importeringer:

import {Image} from './image';
let img = new Image()
img.state = Image.State.Error

Her er en kode-sandkasse som viser dette i praksis.

Svar #2

Her er min løsning.

program.ts:

enum Status {
    Deleting,
    Editing,
    Existing,
    New
}

export class Program {
    static readonly Status = Status;
    readonly Status = Program.Status;

    title: string;

    status: Status;

    constructor(init?: Partial<Program>) {
        Object.assign(this, init);
    }
}

Bruk:

let program = new Program({ title: `some title` });

program.status = Program.Status.New;

eller

program.status = program.Status.New;

Ekstra fordel for Angular 2+-brukere: dette kan brukes i maler

<div *ngIf="program.status === program.Status.New">
  Only display if status of the program is New
</div>

Svar #3

Jeg støtte også på dette problemet nylig. Dette er hva jeg for øyeblikket bruker som en løsning:

// File: Image.ts

class Image
{
    constructor()
    {
        this.state = Image.State.Idle;
    }

    state: Image.State;
}

module Image
{
    export enum State
    {
        Idle,
        Loading,
        Ready,
        Error
    }
}

export = Image;

Så på stedet der jeg bruker klassen og dens enum:

import Image = require("Image");

let state = Image.State.Idle;
let image = new Image();
state = image.state;

Dette ser ut til å fungere fint (selv om jeg ikke ser på det som den forventede måten å gjøre denne typen ting på).

Forhåpentligvis vil det være en måte i TypeScript å gjøre det på denne måten:

class Image
{
    enum State
    {
        Idle,
        Loading,
        Ready,
        Error
    }

    constructor()
    {
        this.state = State.Idle;
    }

    state: State;
}

export = Image;

Relaterte artikler