打字稿版本: 2.1.4
代码
以下代码用于在 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
}
我认为新行为是正确的。
由于k++
是数字和数字之间的运算,因此k
成为数字确实有意义。
我唯一的解决方法是
for (let k: Digit = 1; k < 10; k = <Digit>(k + 1)) {
// k is digit
}
要么
// 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
}
第二种方法表达能力较差,但更简洁。
问题
有没有更好的方法来迭代自定义类型的原始值?
我不确定用例是什么,但为了同时保留所需的类型并保持正确性,我认为以下是合适的
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);
}
我说保持正确性,因为为了退出您的示例中的循环, k
必须采用值10
,它不是Digit
。
最有用的评论
我不确定用例是什么,但为了同时保留所需的类型并保持正确性,我认为以下是合适的
我说保持正确性,因为为了退出您的示例中的循环,
k
必须采用值10
,它不是Digit
。