Versão TypeScript: 2.1.4
Código
O código a seguir costumava funcionar no 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
}
Acho que o novo comportamento está correto.
Como k++
é uma operação entre um dígito e um número, faz sentido que k
se torne um número.
A única solução que eu trouxe é
for (let k: Digit = 1; k < 10; k = <Digit>(k + 1)) {
// k is digit
}
ou
// 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
}
A segunda abordagem é menos expressiva, mas mais limpa.
Pergunta
Existe uma maneira melhor de iterar sobre valores primitivos de um tipo personalizado?
Não tenho certeza de qual é o caso de uso, mas para reter simultaneamente o tipo desejado e manter a correção, acho que o seguinte seria apropriado
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);
}
Eu digo para manter a correção porque para sair do loop em seu exemplo, k
deve assumir o valor 10
que não é Digit
.
Comentários muito úteis
Não tenho certeza de qual é o caso de uso, mas para reter simultaneamente o tipo desejado e manter a correção, acho que o seguinte seria apropriado
Eu digo para manter a correção porque para sair do loop em seu exemplo,
k
deve assumir o valor10
que não éDigit
.