是否可以在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
可能是一件奇怪的事情,只是想知道是否可能。
答案 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文件导入您的班级并使用它即可。