Jenis primitif skrip ketikan: ada perbedaan antara jenis "angka" dan "Nomor" (apakah TSC peka huruf besar kecil)?

91

Saya bermaksud menulis parameter tipe number, tetapi saya salah mengeja tipe, Numbersebagai gantinya menulis .

Di IDE saya (JetBrains WebStorm), jenisnya Numberditulis dengan warna yang sama yang digunakan untuk jenis primitif number, sedangkan jika saya menulis nama kelas (diketahui atau tidak dikenal) menggunakan warna yang berbeda, jadi saya rasa entah bagaimana ia mengenali jenis yang salah eja sebagai jenis yang benar / hampir benar / semacam-dari-benar.

Ketika saya mengkompilasi kode, alih-alih mengeluh misalnya bahwa kompiler tidak dapat menemukan kelas bernama Number, TSC menulis pesan kesalahan ini:

Illegal property access

Apakah itu berarti bahwa numberdan Numberkeduanya hidup berdampingan sebagai tipe yang berbeda?

Jika ini benar, manakah perbedaan antara kelas-kelas itu?

Jika ini bukan masalahnya, mengapa itu tidak menulis pesan kesalahan yang sama yang ditampilkan untuk kelas yang tidak dikenal ("Nama 'Nomor' tidak ada dalam cakupan saat ini")

Ini kodenya:

class Test
{
    private myArray:string[] = ["Jack", "Jill", "John", "Joe", "Jeff"];

    // THIS WORKS
    public getValue(index:number):string
    {
        return this.myArray[index];
    }

    // THIS DOESN'T WORK: ILLEGAL PROPERTY ACCESS
    public getAnotherValue(index:Number):string
    {
        return this.myArray[index]; 
    }
}
Cesco
sumber

Jawaban:

57

JavaScript memiliki pengertian tentang tipe primitif (bilangan, string, dll) dan tipe objek (Number, String, dll, yang manifes saat runtime). TypeScript numberdan Numbermengacu padanya, masing-masing. JavaScript biasanya akan memaksa tipe objek menjadi padanan primitifnya, atau sebaliknya:

var x = new Number(34);
> undefined
x
> Number {}
x + 1
> 35

Aturan sistem tipe TypeScript menangani ini (spesifikasi bagian 3.7) seperti ini:

Untuk tujuan menentukan hubungan kompatibilitas subtipe, supertipe, dan penugasan, tipe primitif Number, Boolean, dan String diperlakukan sebagai tipe objek dengan properti yang sama dengan antarmuka 'Number', 'Boolean', dan 'String'.

Ryan Cavanaugh
sumber
8
Dapat ditambahkan bahwa mereka tidak dapat diberikan
tugas
5
Juga untuk menjawab poster asli: Ya TSC (seperti javascript) case sensitive :)
basarat
115

Untuk menambah jawaban Ryan dengan panduan dari TypeScript Do's and Don'ts :

Jangan pernah menggunakan jenis Number, String, Boolean, Symbol, atau Objectjenis ini mengacu pada objek kotak non-primitif yang hampir tidak pernah digunakan secara tepat dalam kode JavaScript.

/* WRONG */
function reverse(s: String): String;

Jangan menggunakan jenis number, string, boolean, dan symbol.

/* OK */
function reverse(s: string): string;
Shaun Luttin
sumber
2
@ilkan Itu menyenangkan. Saya kira mereka tidak mengikuti nasihat mereka sendiri.
Shaun Luttin
1
@RyanCavanaugh Kurasa kita harus melaporkan ini.
atilkan
3
@ShaunLuttin Bagaimana dengan array, saya tidak dapat menemukan contoh huruf kecil.
atilkan
3
@atilkan Anda mungkin harus menggunakan []untuk menunjukkan tipe array. Mungkin ada pengecualian, saya tidak yakin.
Victor Zamanian
1
@VictorZamanian Ada penjelasan yang bagus di sini -> toddmotto.com/typing-arrays-typescript
atilkan
1

Seperti yang dikatakan dokumen TypeScript:

var Number: NumberConstructor
(value?: any) => number

Sebuah objek yang merepresentasikan bilangan apapun. Semua nomor JavaScript adalah angka floating-point 64-bit.

Seperti yang dikatakan, ambil anysebagai parameter dan kembalikan nomor ataunull

Ini memberikan cara mudah untuk memeriksa suatu nilai adalah angka atau tidak

Number("1234");   // 1234
Number("1234.54") // 1234.54
Number("-1234.54") // -1234.54
Number("1234.54.33") // null
Number("any-non-numeric") // null

Jadi sederhananya bisa kita gunakan untuk mengecek nomor tersebut, seperti:

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}
Ali Adravi
sumber