枚举内部类(TypeScript定义文件)

时间:2015-04-24 10:22:06

标签: typescript definition

我已经四处寻找,但似乎无法找到答案,希望你能提供帮助。如何为图像添加枚举?这是我理想的,但我得到一个错误。

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

    }

  }

}

如果我将状态移动到图形模块它可以工作,但现在状态属于图形...这是不正确的,它需要是图像的一部分。

有什么想法吗? 感谢

7 个答案:

答案 0 :(得分:32)

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

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

答案 1 :(得分:27)

我认为以下是对最高投票解决方案的改进:

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

答案 2 :(得分:19)

这是我的解决方案。

<强> 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>

答案 3 :(得分:3)

我认为这种带有模块扩充的东西是一种非常hacky和非直观的做事方式,所以请考虑一下:

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;

也就是说,只需在要导出的类的范围内声明枚举而不导出它,然后通过类的成员公开它。

*关于代码的结构和组织,即使技术上有效,也是如此。

<强>更新

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;

答案 4 :(得分:2)

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

  }

}

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

答案 5 :(得分:1)

我不确定您打算做什么,但我原本希望您希望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();
        }
    }
}

答案 6 :(得分:0)

您可以创建具有相同名称的模块和类。它也可能有助于重命名您的枚举,这样您就不必说State两次:

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

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