class 中的枚举(TypeScript 定义文件)

Enum inside class (TypeScript definition file)

我四处搜索,但似乎找不到答案,希望你能帮忙。

如何向 Image 添加枚举?这是我理想中想要的,但出现错误。

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.

的一部分

我不确定你打算做什么,但我希望你会想要一个 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();
        }

    }
}

听起来您想声明一个具有类似枚举成员的 class,而不是在 class 中声明一个枚举。即:

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

您可以创建一个与 class 同名的模块。它也可能有助于重命名您的枚举,这样您就不必说 State 两次:

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

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

我想我可能找到了解决方案...我不知道它是否是有效的 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();
    }

  }

}

任何人都可以发现我没有注意到的任何潜在问题吗?

我最近也遇到了这个问题。 这是我目前使用的解决方案:

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

然后在我使用 class 及其枚举的地方:

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;

我认为这种带有模块扩充的东西是一种非常笨拙且不直观的做事方式*,所以考虑一下:

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;

也就是在class的范围内声明枚举,不导出,然后通过class.[=13的成员公开=]

* 在代码的结构和组织方面是糟糕的,即使它在技术上可行。

更新

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;

我认为以下是对 KoenT 解决方案的改进:

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

这是我的解决方案。

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>