Tipi primitivi dattiloscritti: qualche differenza tra i tipi "numero" e "numero" (TSC non fa distinzione tra maiuscole e minuscole)?


93

Volevo scrivere un parametro di tipo number, ma ho sbagliato a scrivere il tipo, scrivendo Numberinvece.

Sul mio IDE (JetBrains WebStorm) il tipo Numberè scritto con lo stesso colore che viene usato per il tipo primitivo number, mentre se scrivo il nome di una classe (conosciuta o sconosciuta) usa un colore diverso, quindi immagino che in qualche modo lo riconosca il tipo errato come tipo corretto / quasi corretto / tipo corretto.

Quando compilo il codice, invece di lamentarmi ad esempio che il compilatore non è riuscito a trovare una classe denominata Number, TSC scrive questo messaggio di errore:

Illegal property access

Ciò significa che numbered Numberentrambi coesistono come tipi diversi?

Se questo è vero, qual è la differenza tra queste classi?

In caso contrario, perché semplicemente non ha scritto lo stesso messaggio di errore visualizzato per le classi sconosciute ("Il nome 'Numero' non esiste nell'ambito corrente")

Questo è il codice:

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]; 
    }
}

Risposte:


60

JavaScript ha la nozione di tipi primitivi (numero, stringa, ecc.) E tipi di oggetto (Numero, Stringa, ecc., Che sono manifestati in fase di esecuzione). TypeScript numbere Numberfare riferimento a loro, rispettivamente. JavaScript di solito costringe un tipo di oggetto al suo equivalente primitivo, o viceversa:

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

Le regole del sistema di tipo TypeScript si occupano di questo (sezione delle specifiche 3.7) in questo modo:

Ai fini della determinazione delle relazioni di compatibilità di sottotipo, supertipo e assegnazione, i tipi primitivi Number, Boolean e String vengono trattati come tipi di oggetto con le stesse proprietà rispettivamente delle interfacce "Number", "Boolean" e "String".


8
Si potrebbe aggiungere che non sono esattamente assegnabili in modo incrociato: typescriptlang.org/Playground/…
basarat

5
Anche per rispondere al poster originale: Sì TSC (come javascript) fa distinzione tra maiuscole e minuscole :)
basarat

122

Per aumentare la risposta di Ryan con la guida delle cose da fare e da non fare di TypeScript :

Non utilizzare mai i tipi Number, String, Boolean, Symbol, o ObjectQuesti tipi si riferiscono ad oggetti in scatola non primitive che vengono quasi mai utilizzati in modo appropriato nel codice JavaScript.

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

Non utilizzare i tipi number, string, boolean, e symbol.

/* OK */
function reverse(s: string): string;

2
@atilkan È divertente. Immagino che non stiano seguendo i propri consigli.
Shaun Luttin

1
@ RyanCavanaugh Immagino che dovremmo segnalarlo.
atilkan

3
@ShaunLuttin E per quanto riguarda l'array, non riesco a trovare alcun esempio in minuscolo.
atilkan

3
@atilkan Probabilmente dovresti usarlo []per denotare i tipi di array. Potrebbero esserci delle eccezioni, non ne sono sicuro.
Victor Zamanian

1
@VictorZamanian C'è una buona spiegazione qui -> toddmotto.com/typing-arrays-typescript
atilkan

1

Come dice il documento TypeScript:

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

Un oggetto che rappresenta un numero di qualsiasi tipo. Tutti i numeri JavaScript sono numeri in virgola mobile a 64 bit.

Come si dice, prendi anycome parametro e restituisci il numero onull

Fornisce un modo semplice per verificare che un valore sia un numero o meno

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

Quindi semplicemente possiamo usare per controllare il numero, come:

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.