Versión de TypeScript: 2.1.4
Código
El siguiente código utilizado para trabajar en 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
}
Creo que el nuevo comportamiento es correcto.
Dado que k++
es una operación entre un dígito y un número, tiene sentido que k
convierta en un número.
El único trabajo con el que he venido es
for (let k: Digit = 1; k < 10; k = <Digit>(k + 1)) {
// k is digit
}
o
// 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
}
El segundo enfoque es menos expresivo, pero más limpio.
Pregunta
¿Existe una mejor manera de iterar sobre valores primitivos de un tipo personalizado?
No estoy seguro de cuál es el caso de uso, pero para retener simultáneamente el tipo deseado y mantener la corrección, creo que lo siguiente sería apropiado
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);
}
Digo mantener la corrección porque para salir del ciclo en su ejemplo, k
debe tomar el valor 10
que no es un Digit
.
Comentario más útil
No estoy seguro de cuál es el caso de uso, pero para retener simultáneamente el tipo deseado y mantener la corrección, creo que lo siguiente sería apropiado
Digo mantener la corrección porque para salir del ciclo en su ejemplo,
k
debe tomar el valor10
que no es unDigit
.