Typescript: Question/Idée : Itérer sur les valeurs primitives d'un type personnalisé

Créé le 11 déc. 2016  ·  1Commentaire  ·  Source: microsoft/TypeScript

Version TypeScript : 2.1.4

Code
Le code suivant fonctionnait dans TS 2.0

type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;

function iExpectDigit(d:Digit)
{ }

for (let k: Digit = 1; k < 10; k++) {
  iExpectDigit(k); //Error, because K is number
}

Je pense que le nouveau comportement est correct.
Puisque k++ est une opération entre un chiffre et un nombre, il est logique que k devienne un nombre.

Le seul travail avec lequel je suis venu est

for (let k: Digit = 1; k < 10; k = <Digit>(k + 1)) {
    // k is digit
}

ou alors

// in some module
export let digits: Digit[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

for (let k of digits)
{
    // k is digit
}

La seconde approche est moins expressive, mais plus propre.

Question
Existe-t-il un meilleur moyen d'itérer sur les valeurs primitives d'un type personnalisé ?

Question

Commentaire le plus utile

Je ne sais pas quel est le cas d'utilisation, mais pour conserver simultanément le type souhaité et maintenir l'exactitude, je pense que ce qui suit serait approprié

type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;

function iExpectDigit(d: Digit) { }

function isDigit(n: number): n is Digit {
    return n > -1 && n < 10 && n === Math.trunc(n);
}

for (let k = 0; isDigit(k); k++) {
    iExpectDigit(k);
}

Je dis maintenir l'exactitude car pour quitter la boucle dans votre exemple, k doit prendre la valeur 10 qui n'est pas un Digit .

>Tous les commentaires

Je ne sais pas quel est le cas d'utilisation, mais pour conserver simultanément le type souhaité et maintenir l'exactitude, je pense que ce qui suit serait approprié

type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;

function iExpectDigit(d: Digit) { }

function isDigit(n: number): n is Digit {
    return n > -1 && n < 10 && n === Math.trunc(n);
}

for (let k = 0; isDigit(k); k++) {
    iExpectDigit(k);
}

Je dis maintenir l'exactitude car pour quitter la boucle dans votre exemple, k doit prendre la valeur 10 qui n'est pas un Digit .

Cette page vous a été utile?
0 / 5 - 0 notes