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];
}
}
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.
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
ouObject
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
etsymbol
./* OK */ function reverse(s: string): string;