Typescript 枚举对象的类型是什么

Typescript 枚举对象的类型是什么,typescript,generics,typing,Typescript,Generics,Typing,我想编写枚举元素集的包装器类 export class Flags<ENUMERATION> { items = new Set<ENUMERATION>(); enu; // what type ? constructor(enu) { // what type ? this.enu=enu; } set(id:ENUMERATION) { this.items.add

我想编写枚举元素集的包装器类

export class Flags<ENUMERATION> {

    items = new Set<ENUMERATION>();

    enu;                // what type ?

    constructor(enu) {     // what type ?
        this.enu=enu;
    }

    set(id:ENUMERATION) { this.items.add(id); return this; }

     // an use: an arbitrary string references an enum element or is rejected
    setChecking(id:string):boolean{
        if (id in this.enu){
            let what = this.enu[id];
            this.items.add(what);
            return true;
        }
        return false;
    }
  // .....
}

(ts将从构造函数中的规范推断类型)

您可以切换类型参数以表示枚举容器对象而不是枚举。枚举的类型将是
ENUMERATION[keyof ENUMERATION]>

export class Flags<ENUMERATION extends { [P in keyof ENUMERATION]: any}> {

    items = new Set<ENUMERATION[keyof ENUMERATION]>();

    enu: ENUMERATION;                // what type ?

    constructor(enu: ENUMERATION) {     // what type ?
        this.enu=enu;
    }

    set(id:ENUMERATION[keyof ENUMERATION]) { this.items.add(id); return this; }

    // an use: an arbitrary string references an enum element or is rejected
    setChecking(id:string):boolean{
        if (id in this.enu){
            let what = this.enu[id as keyof ENUMERATION];
            this.items.add(what);
            return true;
        }
        return false;
    }
// .....
}

enum Props{ One, Two, Three };
let fls=new Flags(Props);
fls.set(Props.One);
fls.set("asdf");          // ts detectes the wrong value
fls.set(Props.Two);
if (!fls.setChecking("xxxx"))  // Some external string can be checked agains the set/enum
{

}
导出类标志{
items=新集合();
enu:枚举;//什么类型?
构造函数(enu:枚举){//什么类型?
这个。enu=enu;
}
set(id:ENUMERATION[keyof ENUMERATION]){this.items.add(id);返回this;}
//用法:任意字符串引用枚举元素或被拒绝
setChecking(id:string):布尔值{
如果(此.enu中的id){
让what=this.enu[id作为枚举的键];
此.items.add(什么);
返回true;
}
返回false;
}
// .....
}
枚举属性{1,2,3};
设fls=新标志(道具);
fls套装(道具一);
fls.set(“asdf”);//ts检测到错误的值
一套(道具二);
if(!fls.setChecking(“xxxx”)//可以在集合/枚举中检查某些外部字符串
{
}

非常感谢您!
  let fls=new U.Flags(Props);
export class Flags<ENUMERATION extends { [P in keyof ENUMERATION]: any}> {

    items = new Set<ENUMERATION[keyof ENUMERATION]>();

    enu: ENUMERATION;                // what type ?

    constructor(enu: ENUMERATION) {     // what type ?
        this.enu=enu;
    }

    set(id:ENUMERATION[keyof ENUMERATION]) { this.items.add(id); return this; }

    // an use: an arbitrary string references an enum element or is rejected
    setChecking(id:string):boolean{
        if (id in this.enu){
            let what = this.enu[id as keyof ENUMERATION];
            this.items.add(what);
            return true;
        }
        return false;
    }
// .....
}

enum Props{ One, Two, Three };
let fls=new Flags(Props);
fls.set(Props.One);
fls.set("asdf");          // ts detectes the wrong value
fls.set(Props.Two);
if (!fls.setChecking("xxxx"))  // Some external string can be checked agains the set/enum
{

}