web-dev-qa-db-fra.com

Enum inside class (fichier de définition TypeScript)

J'ai cherché autour mais je n'arrive pas à trouver une réponse à cette question, j'espère que vous pourrez aider. Comment puis-je ajouter une énumération à l'image? C'est ce que j'aimerais idéalement, mais je reçois une erreur.

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

    }

  }

}

Si je déplace State dans le module Graphics, cela fonctionne, mais State appartient maintenant à Graphics ... qui est incorrect, il doit faire partie de Image.

Des idées? Merci

48
Lewis Peel

Je pense que j'ai peut-être trouvé une solution ... que ce soit valide TypeScript, je ne le sais pas, mais cela fonctionne et ne cause aucune erreur de compilation. C'est une combinaison des réponses ci-dessus.

declare module 'Lib' {

  module Graphics {

    module Image {
      enum State { }
      var STATE_IDLE: State;
      var STATE_LOADING: State;
      var STATE_READY: State;
      var STATE_ERROR: State;
    }

    class Image {
      constructor();
    }

  }

}

Quelqu'un peut-il déceler des problèmes potentiels que je n'ai pas remarqués?

2
Lewis Peel

J'ai aussi rencontré ce problème récemment. C'est ce que j'utilise actuellement comme solution:

// 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;

Puis à l'endroit où j'utilise la classe et son enum:

import Image = require("Image");

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

Cela semble bien fonctionner (même si je ne le considère pas comme le moyen attendu de faire ce genre de chose).

Espérons qu'il y aura un moyen dans TypeScript de le faire de cette façon:

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

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

    state: State;
}

export = Image;
35
KoenT

Je pense que ce qui suit est une amélioration par rapport à la solution la plus votée:

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

    state: Image.State;
}

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

L'avantage est que vous pouvez tirer parti des importations nommées:

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

Voici ma solution.

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

tilisation:

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

program.status = Program.Status.New;

ou

program.status = program.Status.New;

Avantage ajouté pour Angular 2+ utilisateurs: cela peut être utilisé dans les modèles

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

Je pense que ce genre de choses avec l’augmentation de module est une manière très hacky et non intuitive de faire les choses, alors considérez ceci:

export module Graphics
{
    enum State
    {
        STATE_IDLE,
        STATE_LOADING,
        STATE_READY,
        STATE_ERROR
    }

    export class Image
    {
        constructor() { }
        public static readonly State = State;
    }
}

//...

let imgState = Graphics.Image.State.STATE_ERROR;

Autrement dit, déclarez simplement l'énum dans l'étendue de la classe à laquelle vous souhaitez l'ajouter sans l'exporter, puis exposez-le via un membre de la classe.

* Ce qui en ce qui concerne la structuration et l'organisation du code est mauvais, même si cela fonctionne techniquement.

Mise à jour

declare module Lib
{
    enum State
    {
        STATE_IDLE,
        STATE_LOADING,
        STATE_READY,
        STATE_ERROR
    }

    class ImageClass
    {
        constructor();
        public Prop: any;
    }

    export interface Graphics
    {
        Image: typeof State & ImageClass & (new () => typeof State & ImageClass);
    }
}

declare var Graphics: Lib.Graphics;

Ensuite, vous tapez comme:

var someEnum = Graphics.Image.STATE_ERROR;
var image = new Graphics.Image();
var anotherEnum = image.STATE_IDLE;
3
Alex

Je ne suis pas sûr de ce que vous avez l'intention de faire, mais j'aurais pensé que vous voudriez que enum représente les valeurs possibles de l'état, puis un state membre sur l'image pour indiquer le état actuel de l'image.

declare module 'Lib' {
    export module Graphics {

        enum State {
            STATE_IDLE,
            STATE_LOADING,
            STATE_READY,
            STATE_ERROR
        }

        export class Image {
            public state: State;

            constructor();
        }

    }
}

Il semble que vous souhaitiez déclarer une classe ayant des membres similaires à un enum, plutôt que de déclarer un enum dans une classe. c'est à dire:

declare module 'Lib' {

    export module Graphics {

        export class Image {
            static STATE_IDLE: number;
            static STATE_LOADING: number;
            static STATE_READY: number;
            static STATE_ERROR: number;

            constructor();
        }
    }
}
1
Fenton

Vous pouvez créer un module et une classe du même nom. Il pourrait également être utile de renommer votre enum afin de ne pas avoir à dire State deux fois:

declare module 'Lib' {
    export module Graphics {
        export class Image {
            constructor();
        }

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