web-dev-qa-db-fra.com

Types primitifs dactylographiés: toute différence entre les types "nombre" et "nombre" (TSC est-il 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, tandis que si j'écris un nom d'une classe (connue ou inconnue), il utilise une couleur différente, donc je suppose qu'il reconnaît en quelque sorte le type mal orthographié comme un type correct/presque correct/sorte de correct.

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

Illegal property access

Est-ce à dire que number et Number coexistent tous deux en tant que types différents?

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

Si ce n'est pas le cas, alors pourquoi il n'a tout simplement pas é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]; 
    }
}
68
Cesco

JavaScript a la notion de types primitifs (nombre, chaîne, etc.) et objet types (nombre, chaîne, etc., qui sont manifestes au moment de l'exécution). Les types TypeScript number et Number y font respectivement référence. JavaScript contraint généralement un type d'objet à son équivalent primitif, ou vice versa:

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

Les règles du système de type TypeScript traitent de cela (spécification section 3.7) comme ceci:

Pour déterminer les relations de sous-type, de sur-type et de compatibilité d'affectation, les types primitifs Number, Boolean et String sont traités comme des types d'objet avec les mêmes propriétés que les interfaces "Number", "Boolean" et "String" respectivement.

40
Ryan Cavanaugh

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

N'utilisez pas les types Number, String, Boolean, Symbol ou Object Ces types font référence à des objets encadrés non primitifs qui ne sont presque jamais utilisés correctement dans le code JavaScript.

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

Utilisez les types number, string, boolean et symbol .

/* OK */
function reverse(s: string): string;
79
Shaun Luttin