Подтвердить что ты не робот

Enum внутри класса (TypeScript файл определения)

Я искал вокруг, но, похоже, не могу найти ответ для этого, надеюсь, вы можете помочь. Как добавить перечисление в изображение? Это то, что я хотел бы идеально, но я получаю сообщение об ошибке.

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

    }

  }

}

Если я перемещаю State в модуль Graphics, он работает, но теперь State принадлежит Graphics..., который является неправильным, он должен быть частью Image.

Любые идеи? Благодаря

4b9b3361

Ответ 1

Я думаю, что я нашел решение... действительно ли оно TypeScript Я не знаю, но он работает и не вызывает ошибок компиляции. Это сочетание вышеупомянутых ответов.

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

  }

}

Может ли кто-нибудь выявить какие-либо потенциальные проблемы с этим, что я не заметил?

Ответ 2

Недавно я столкнулся с этой проблемой. Это то, что я сейчас использую в качестве решения:

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

Затем в том месте, где я использую класс и его перечисление:

import Image = require("Image");

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

Кажется, что все работает нормально (хотя я не считаю это ожидаемым способом делать такие вещи).

Надеюсь, в TypeScript будет способ сделать это следующим образом:

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

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

    state: State;
}

export = Image;

Ответ 3

Я не уверен, что вы намереваетесь делать, но я бы ожидал, что вы хотите, чтобы enum представлял возможные значения состояния, а затем элемент state на изображении, чтобы указать текущее состояние изображение.

declare module 'Lib' {
    export module Graphics {

        enum State {
            STATE_IDLE,
            STATE_LOADING,
            STATE_READY,
            STATE_ERROR
        }

        export class Image {
            public state: State;

            constructor();
        }

    }
}

Похоже, вы хотите объявить класс, у которого есть члены, подобные перечислению, а не объявлять перечисление внутри класса. то есть:

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

Ответ 4

Я думаю, что следующее усовершенствование в главном голосовавшем решении:

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

    state: Image.State;
}

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

Преимущество состоит в том, что вы можете использовать именованный импорт:

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

Ответ 5

Я думаю, что этот материал с расширением модуля - очень хакерский и неинтуитивный способ * делать вещи, поэтому рассмотрим это:

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;

То есть просто объявите перечисление в области класса, к которому вы хотите добавить его, без его экспорта, а затем выведите его через член класса.

* Что касается структурирования и организации кода BAD, даже если он технически работает.

Обновление

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;

Затем вы печатаете:

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

Ответ 6

Вы можете создать модуль и класс с тем же именем. Это также может помочь переименовать ваше перечисление, чтобы вам не пришлось дважды говорить State:

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

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

Ответ 7

Здесь мое решение.

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

Применение:

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

program.status = Program.Status.New;

или

program.status = program.Status.New;

Добавлено преимущество для Angular 2+ пользователей:. Это можно использовать в шаблонах

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