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é ?
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
.
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é
Je dis maintenir l'exactitude car pour quitter la boucle dans votre exemple,
k
doit prendre la valeur10
qui n'est pas unDigit
.