Typescript: Pergunta / ideia: repita valores primitivos de um tipo personalizado

Criado em 11 dez. 2016  ·  1Comentário  ·  Fonte: microsoft/TypeScript

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?

Question

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

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 .

>Todos os comentários

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 .

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

kyasbal-1994 picture kyasbal-1994  ·  3Comentários

seanzer picture seanzer  ·  3Comentários

fwanicka picture fwanicka  ·  3Comentários

Antony-Jones picture Antony-Jones  ·  3Comentários

jbondc picture jbondc  ·  3Comentários