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?
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
.
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
Ich sage, behalten Sie die Korrektheit bei, denn um die Schleife in Ihrem Beispiel zu verlassen, muss
k
den Wert10
annehmen, der keinDigit
.