TypeScript:向Enum添加函数

时间:2015-01-26 13:11:27

标签: enums typescript

是否可以在TypeScript中向Enum类型添加函数?

例如:

enum Mode {
    landscape,
    portrait,

    // the dream...
    toString() { console.log(this); } 
}

或者:

class ModeExtension {
    public toString = () => console.log(this);
}

enum Mode extends ModeExtension {
    landscape,
    portrait,
}

当然toString()函数会包含类似switch的内容但是用例会沿着以下几行流动:

class Device {
    constructor(public mode:Mode) {
        console.log(this.mode.toString());
    }
}

我理解为什么扩展enum可能是一件奇怪的事情,只是想知道是否可能。

5 个答案:

答案 0 :(得分:55)

你可以拥有一个与Enum分开的类,并使用它来获取你想要的东西,或者你可以将一个命名空间合并到Enum中,并将它们全部放在看起来相同的地方。

模式实用程序类

所以这不完全是你所追求的,但这允许你使用静态方法封装“模式到字符串”行为。

class ModeUtil {
    public static toString(mode: Mode) {
        return Mode[mode];
    }
}

你可以像这样使用它:

const mode = Mode.portrait;
const x = ModeUtil.toString(mode);
console.log(x);

模式枚举/命名空间合并

您可以将命名空间与Enum合并,以便使用其他方法创建看起来像Enum的命名空间:

enum Mode {
    X,
    Y
}

namespace Mode {
    export function toString(mode: Mode): string {
        return Mode[mode];
    }

    export function parse(mode: string): Mode {
        return Mode[mode];
    }
}

const mode = Mode.X;

const str = Mode.toString(mode);
alert(str);

const m = Mode.parse(str);
alert(m);

答案 1 :(得分:25)

您可以使用方括号来获取非const枚举的字符串值:

class Device {
    constructor(public mode:Mode) {
        console.log(Mode[this.mode]);
    }
}

您还可以将一些枚举特定的util函数放入枚举中,但这就像静态类成员一样:

enum Mode {
    landscape,
    portrait
}

namespace Mode {
    export function doSomething(mode:Mode) {
        // your code here
    }
}

答案 2 :(得分:4)

enum转换为枚举模式。我发现对于许多语言来说这是一种更好的做法,因为否则你会限制类型的封装选项。对于枚举值,趋势是switch,当真正依赖于特定枚举值的任何数据或功能时,应该只进入枚举的每个实例。我已经添加了一些代码来演示。

如果您特别依赖于基础枚举值,则这可能不起作用。在这种情况下,您需要为旧值添加成员并转换需要它的位置以使用新属性。

class Mode {
   public static landscape = new Mode(1920, 1080);
   public static portrait = new Mode(1080, 1920);

   public get Width(): number { return this.mWidth; }
   public get Height(): number { return this.mHeight; }

   // private constructor if possible in a future version of TS
   constructor(
      private mWidth: number,
      private mHeight: number
   ) {
   }

   public GetAspectRatio() {
      return this.mWidth / this.mHeight;
   }
}

答案 3 :(得分:2)

can make enum like by private constructor and static get return object

export class HomeSlideEnum{

  public static get friendList(): HomeSlideEnum {

    return new HomeSlideEnum(0, "friendList");

  }
  public static getByOrdinal(ordinal){
    switch(ordinal){
      case 0:

        return HomeSlideEnum.friendList;
    }
  }

  public ordinal:number;
  public key:string;
  private constructor(ordinal, key){

    this.ordinal = ordinal;
    this.key = key;
  }


  public getTitle(){
    switch(this.ordinal){
      case 0:

        return "Friend List"
      default :
        return "DChat"
    }
  }

}

then later can use like this

HomeSlideEnum.friendList.getTitle();

答案 4 :(得分:1)

Fenton解决方案的补充。 如果要在另一个类中使用此枚举器,则需要导出枚举和名称空间。看起来像这样:

export enum Mode {
    landscape,
    portrait
}

export namespace Mode {
    export function toString(mode: Mode): string {
        return Mode[mode];
    }
}

然后,您只需将class.enum.ts文件导入您的班级并使用它即可。