Typescript: Frage/Idee : Über primitive Werte eines benutzerdefinierten Typs iterieren

Erstellt am 11. Dez. 2016  ·  1Kommentar  ·  Quelle: microsoft/TypeScript

TypeScript-Version: 2.1.4

Code
Der folgende Code funktionierte in 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
}

Ich finde das neue Verhalten richtig.
Da k++ eine Operation zwischen einer Ziffer und einer Zahl ist, macht es Sinn, dass aus k eine Zahl wird.

Die einzige Lösung, mit der ich gekommen bin, ist

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

oder

// 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
}

Der zweite Ansatz ist weniger ausdrucksstark, aber sauberer.

Frage
Gibt es eine bessere Möglichkeit, über primitive Werte eines benutzerdefinierten Typs zu iterieren?

Question

Hilfreichster Kommentar

Ich bin mir nicht sicher, was der Anwendungsfall ist, aber um gleichzeitig den gewünschten Typ beizubehalten und die Korrektheit zu wahren, halte ich Folgendes für angemessen

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);
}

Ich sage, behalten Sie die Korrektheit bei, denn um die Schleife in Ihrem Beispiel zu verlassen, muss k den Wert 10 annehmen, der kein Digit .

>Alle Kommentare

Ich bin mir nicht sicher, was der Anwendungsfall ist, aber um gleichzeitig den gewünschten Typ beizubehalten und die Korrektheit zu wahren, halte ich Folgendes für angemessen

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);
}

Ich sage, behalten Sie die Korrektheit bei, denn um die Schleife in Ihrem Beispiel zu verlassen, muss k den Wert 10 annehmen, der kein Digit .

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen