Versi TypeScript: 2.1.4
Kode
Kode berikut digunakan untuk bekerja di 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
}
Saya pikir perilaku baru itu benar.
Karena k++
adalah operasi antara angka dan angka, masuk akal jika k
menjadi angka.
Satu-satunya pekerjaan yang saya lakukan adalah
for (let k: Digit = 1; k < 10; k = <Digit>(k + 1)) {
// k is digit
}
atau
// 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
}
Pendekatan kedua kurang ekspresif, tetapi lebih bersih.
Pertanyaan
Apakah ada cara yang lebih baik untuk mengulangi nilai primitif dari tipe khusus?
Saya tidak yakin apa kasus penggunaannya, tetapi untuk secara bersamaan mempertahankan jenis yang diinginkan dan mempertahankan kebenaran, saya pikir yang berikut ini akan sesuai
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);
}
Saya katakan pertahankan kebenaran karena untuk keluar dari loop dalam contoh Anda, k
harus mengambil nilai 10
yang bukan Digit
.
Komentar yang paling membantu
Saya tidak yakin apa kasus penggunaannya, tetapi untuk secara bersamaan mempertahankan jenis yang diinginkan dan mempertahankan kebenaran, saya pikir yang berikut ini akan sesuai
Saya katakan pertahankan kebenaran karena untuk keluar dari loop dalam contoh Anda,
k
harus mengambil nilai10
yang bukanDigit
.