161 votes

Comment spécifier qu'une propriété de classe est un nombre entier ?

J'expérimente avec TypeScript et en cours de création d'une classe avec une ID qui devrait être un integer j'ai été un peu confus.

Tout d'abord, dans Visual Studio 2012 avec le plugin TypeScript, je vois int dans la liste des types d'intelliSense. Mais je reçois une erreur de compilation qui dit :

le nom 'int' n'existe pas dans la portée actuelle.

J'ai examiné les spécifications du langage et je ne vois que les types primitifs suivants : number , string , boolean , null y undefined . Non integer type.

Donc, je me retrouve avec deux questions :

  1. Comment dois-je indiquer à les utilisateurs de ma classe qu'un domaine particulier n'est pas seulement number mais un integer (et jamais un floating point ou decimal ) ?

  2. Pourquoi est-ce que je vois int dans la liste intellisense si ce n'est pas un type valide ?

Mise à jour : Toutes les réponses que j'ai obtenues jusqu'à présent concernent la manière dont JavaScript n'a pas de type int, il serait difficile d'appliquer une règle de type int au moment de l'exécution... Je sais tout cela. Je demande s'il existe un TypeScript comment fournir une annotation aux utilisateurs de ma classe que ce champ doit être un integer . Peut-être un commentaire d'un format particulier ?

3voto

Amin Points 445

AssemblyScript supporte les valeurs entières (avec son backend asm.js). Vous pouvez générer un fichier JavaScript en utilisant --jsFile .

Pour le faire manuellement, vous pouvez forcer une valeur à être un nombre entier en ajoutant | 0 .

Cela améliore les performances car le moteur du navigateur est désormais en mesure d'utiliser des entiers, qui sont plus rapides que les flottants dans les opérations.

Dites que vous avez l'intention d'écrire :

function add(a: i32, b: i32) {
  return a + b
}

Vous devez l'écrire comme suit

type i32 = number
function add(a: i32, b: i32) {
  a = a | 0
  b = b | 0
  return a + b
}

ou en JavaScript (c'est ce que génère asc --jsFile)

function add(a, b) {
  a = a | 0
  b = b | 0
  return a + b
}

Pour les propriétés de classe :

type i32 = number
class MyClass {
  a: i32 = a | 0
}

2voto

Jack Points 3695

Eh bien, comme vous l'avez vu, les typescript n'ont pas de type de données flottantes comme le langage javascript. Seulement ont le number qui couvrent tous les int y double en même temps ; vous devez peut-être créer une fonction qui prend un nombre et vérifie si c'est un int o double en renvoyant un état en cas d'erreur ou de succès. Quelque chose comme ceci comme méthode de votre classe :

function SetN(x:number) {
   var is_int = parseInt(x) === parseFloat(x);
   if(is_int) this.n = x;
   return is_int;
}

//..
y = 10.5;
if(SetN(y)) {
  //OK
} else {
   //error not set y isn't a int
}

Note : cela ne fonctionne pas pour 10.0 Par exemple, si vous ne voulez pas vraiment le faire, vous devez peut-être le convertir en chaîne et essayer de trouver un . .

1voto

Arek Bal Points 11

int a été réservé pour une utilisation future mot-clé dans des versions antérieures de javascript (ECMAScript si vous préférez). Mais c'est un mot valable maintenant (où "maintenant" équivaut à "dans la dernière spécification").

Par exemple, en 262, il était encore réservé, http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Il serait intéressant d'ajouter à Typescript une fonction int implémenté, mais avec toutes les règles de vérification de type et de casting disponibles au moment de la compilation.

0voto

James Wakefield Points 49

Voici un mise en œuvre de l'interface numérique qui ne fait pas de boxe. Je pense qu'il serait possible d'utiliser ce modèle pour créer un type Integer.

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