Какой тип объекта enum - PullRequest
       15

Какой тип объекта enum

0 голосов
/ 10 октября 2018

Я хочу написать класс-оболочку для набора элементов перечисления.

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

, поэтому

    enum Props{ One, Two, Three };
    let fls=new U.Flags<Props>(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
        throw or whatever

Мой вопрос: каков тип свойства enu ипараметр в конструкторе, каков тип объекта enum?

Указав тип в конструкторе, я мог бы написать:

  let fls=new U.Flags(Props);

(ts выведет тип из спецификации вконструктор)

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете переключить параметр типа для представления объекта-контейнера enum вместо enum.Тип перечисления будет 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
{

}
...