web-dev-qa-db-fra.com

Déterminer le nombre d'éléments enum TypeScript

Comme indiqué dans le titre, comment déterminer le nombre d'éléments d'une énumération dans TypeScript, comme dans cet exemple

enum ExampleEnum {

    element1 = 1,
    element2 = 2,
    element3 = 3,
    element4 = 4,
    element5 = 5,
    element6 = 6

}

var exampleEnumElementCount:number = ? 

Comment le nombre serait-il déterminé? Dans ce cas, il devrait être 6

17
TheMuffinCoder

attention: cela ne fonctionne pas sur string enum .

À ma connaissance, TypeScript ne fournit pas de méthode standard permettant d’obtenir le nombre d’éléments enum. Mais depuis sa mise en œuvre , il existe un moyen élégant de le faire.

Object.keys(ExampleEnum).length / 2
26
Zen

Pour développer davantage la réponse de @ Esqarrouth, chaque valeur dans une énumération produira deux clés, à l'exception des valeurs énumérées sous forme de chaîne. Par exemple, étant donné l'énumération suivante dans TypeScript:

enum MyEnum {
    a = 0, 
    b = 1.5,
    c = "oooo",
    d = 2,
    e = "baaaabb"
}

Après avoir transpilé en Javascript, vous obtiendrez:

var MyEnum;
(function (MyEnum) {
    MyEnum[MyEnum["a"] = 0] = "a";
    MyEnum[MyEnum["b"] = 1.5] = "b";
    MyEnum["c"] = "oooo";
    MyEnum[MyEnum["d"] = 2] = "d";
    MyEnum["e"] = "baaaabb";
})(MyEnum || (MyEnum = {}));

Comme vous pouvez le constater, si nous avions simplement une énumération avec une entrée de a avec une valeur de 0, vous vous retrouveriez avec deux clés; MyEnum["a"] et MyEnum[0]. Les valeurs de chaîne, d'autre part, produisent simplement une clé, comme indiqué avec les entrées c et e ci-dessus.

Par conséquent, vous pouvez déterminer le nombre réel en déterminant combien de clés ne sont pas des nombres; c'est à dire,

var MyEnumCount = Object.keys(MyEnum).map((val, idx) => Number(isNaN(Number(val)))).reduce((a, b) => a + b, 0);

Il mappe simplement toutes les clés, en retournant 1 si la clé est une chaîne, 0 sinon, et les ajoute ensuite à l'aide de la fonction de réduction.

Ou, une méthode un peu plus facile à comprendre:

var MyEnumCount = (() => {
    let count = 0;
    Object.keys(MyEnum).forEach((val, idx) => {
        if (Number(isNaN(Number(val)))) {
            count++;
        }
    });
    return count;
})();

Vous pouvez tester vous-même sur le terrain de jeu TypeScript https://www.typescriptlang.org/play/

1
sme

La réponse acceptée ne fonctionne dans aucune des versions enum auxquelles une valeur est associée. Cela ne fonctionne qu'avec les enums les plus basiques. Voici ma version qui fonctionne dans tous les types:

export function enumElementCount(enumName: any): number {
    let count = 0
    for(let item in enumName) {
        if(isNaN(Number(item))) count++
    }
    return count
}

Voici le code de test pour le moka:

it('enumElementCounts', function() {
    enum IntEnum { one, two }
    enum StringEnum { one = 'oneman', two = 'twoman', three = 'threeman' }
    enum NumberEnum { lol = 3, mom = 4, kok = 5, pop = 6 }
    expect(enumElementCount(IntEnum)).to.equal(2)
    expect(enumElementCount(StringEnum)).to.equal(3)
    expect(enumElementCount(NumberEnum)).to.equal(4)
})
1
Esqarrouth