157 votes

Types primitifs de type script : y a-t-il une différence entre les types "number" et "Number" (la TSC est-elle insensible à la casse) ?

Je voulais écrire un paramètre de type number mais j'ai mal orthographié le type, en écrivant Number à la place.

Sur mon IDE (JetBrains WebStorm) le type Number est écrit avec la même couleur que celle utilisée pour le type primitif number En revanche, si j'écris le nom d'une classe (connue ou inconnue), il utilise une couleur différente. Je suppose donc que, d'une manière ou d'une autre, il reconnaît le type mal orthographié comme un type correct/presque-correct/sort-de-correct.

Lorsque je compile le code, au lieu de se plaindre par exemple que le compilateur n'a pas pu trouver une classe nommée Number le TSC écrit ce message d'erreur :

Illegal property access

Est-ce que cela signifie que number y Number les deux coexistent en tant que types différents ?

Si cela est vrai, quelle est la différence entre ces classes ?

Si ce n'est pas le cas, alors pourquoi n'a-t-il pas simplement écrit le même message d'erreur qu'il affiche pour les classes inconnues ("Le nom 'Number' n'existe pas dans la portée actuelle").

Voici le code :

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

194voto

Shaun Luttin Points 1585

Pour compléter la réponse de Ryan avec les conseils de la À faire et à ne pas faire avec TypeScript :

Ne fais pas ça. jamais utilisé les types Number , String , Boolean , Symbol ou Object Ces types font référence à des objets encadrés non primitifs qui sont presque jamais utilisés de manière appropriée dans le code JavaScript.

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

Faites utiliser les types number , string , boolean y symbol .

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

78voto

Ryan Cavanaugh Points 17393

JavaScript possède la notion de primitif (nombre, chaîne de caractères, etc.) et objet (Nombre, Chaîne, etc., qui sont manifestes au moment de l'exécution). Types TypeScript number y Number s'y réfèrent, respectivement. JavaScript convertit généralement un type d'objet en son équivalent primitif, ou vice versa :

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

Les règles du système de types TypeScript traitent ce problème (section 3.7 de la spec) de la manière suivante :

Aux fins de la détermination du sous-type, du supertype et de l'affectation d'affectation, les types primitifs Number, Boolean et String sont traités comme des objets. sont traités comme des types d'objet possédant les mêmes propriétés que les types primitifs Nombre ", " Booléen " et " Chaîne " respectivement.

2voto

Ali Adravi Points 932

Comme le dit le document TypeScript :

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

Un objet qui représente un nombre de n'importe quel type. Tous les nombres JavaScript sont des nombres à virgule flottante de 64 bits.

Comme il est dit, prenez any comme paramètre et numéro de retour ou null

Il donne un moyen facile de vérifier si une valeur est un nombre ou non.

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

Donc, nous pouvons simplement utiliser pour vérifier le nombre, comme :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X