Typescript: 質問/アイデア:カスタムタイプのプリミティブ値を反復処理します

作成日 2016年12月11日  ·  1コメント  ·  ソース: microsoft/TypeScript

TypeScriptバージョン: 2.1.4

コード
TS2.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
}

2番目のアプローチは表現力が劣りますが、よりクリーンです。

質問
カスタムタイプのプリミティブ値を反復処理するためのより良い方法はありますか?

Question

最も参考になるコメント

ユースケースが何であるかはわかりませんが、目的のタイプを維持し、正確さを維持するには、次のことが適切だと思います

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

>すべてのコメント

ユースケースが何であるかはわかりませんが、目的のタイプを維持し、正確さを維持するには、次のことが適切だと思います

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

このページは役に立ちましたか?
0 / 5 - 0 評価