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

Lew*_*eel 54 definition 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();

    }

  }

}
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?谢谢

小智 36

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

// 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;
Run Code Online (Sandbox Code Playgroud)

然后在我正在使用该类及其枚举的地方:

import Image = require("Image");

let state = Image.State.Idle;
let image = new Image();
state = image.state;
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常(即使我不认为这是做这种事情的预期方式).

希望TypeScript中有一种方法可以这样做:

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

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

    state: State;
}

export = Image;
Run Code Online (Sandbox Code Playgroud)


NSj*_*nas 35

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

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

    state: Image.State;
}

export namespace Image
{
    export enum State
    {
        Idle,
        Loading,
        Ready,
        Error
    }
}
Run Code Online (Sandbox Code Playgroud)

优点是您可以利用命名导入:

import {Image} from './image';
let img = new Image()
img.state = Image.State.Error
Run Code Online (Sandbox Code Playgroud)

  • 此技术也在[声明合并](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-namespaces-with-classes)下的官方参考中进行了描述。要将此技术与“export default”一起使用,需要从“class”和“namespace”中删除“export”关键字,并在“namespace”的右括号后添加行“export default Image;”。 (9认同)

Maž*_*ius 25

这是我的解决方案.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

program.status = Program.Status.New;
Run Code Online (Sandbox Code Playgroud)

要么

program.status = program.Status.New;
Run Code Online (Sandbox Code Playgroud)

为Angular 2+用户增加了好处:这可以在模板中使用

<div *ngIf="program.status === program.Status.New">
  Only display if status of the program is New
</div>
Run Code Online (Sandbox Code Playgroud)

  • 不错的方法但是如果我需要声明一个枚举类型的变量怎么办?`enumVar: Program.Status;` 不工作 (3认同)

Lew*_*eel 3

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

  }

}
Run Code Online (Sandbox Code Playgroud)

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