Comprendre les avertissements en mode strict

Comprendre les avertissements en mode strict

> Tutoriel LeekScript

Vous avez décider de passer au mode strict, et l'éditeur vous innonde de multiples avertissements qui n'existaient pas auparavant. Pas de panique c'est tout l'intêret du mode strict d'être moins permissif et de laisser moins de liberté sur le typage surtout. Voyons quelques cas courant d'avertissements remontés, pour comprendre quel est le problème remonté déjà, et trouver des solutions pour y remédier

Conversion dangereuse de type « integer » vers « real »

Un premier cas simple je veux initialiser à 0 une variable de type réél

Le problème ici est qu'on tente d'affecter une valeur 0 de type entier dans une variable de type réél Différentes solutions existent pour résoudre cet avertissement :

Conversion dangereuse de type « integer? » vers « integer »

Autre cas j'ai un tableau de nombres entiers défini comme suit et je veux stocker une valeur de ce dictionnaire dans une variable de type entier également, normallement les types devrait concorder...

Pourquoi l'avertissement nous dit que mapEntier[0] est de type «integer?» et pas «integer» simplement ? Pour rappel, le «?» à la fin d'un type signifie que ce type accepte également les valeurs null c'est un équivalent de «integer | null». Donc pourquoi mon tableau pourrait me retourner une valeur null, alors qu'il ne contient que des integer d'après son type ? Quand on veut lire une valeur dans un tableau il faut lui passer une clé, ici «0» passé entre crochet, cette clé doit être du type défini dans le tableau, ici un integer, donc tout va bien à ce niveau. Mais rien ne garantit à l'éditeur l'existence de la clé dans le tableau, et si on lit un tableau avec une clé qui n'existe pas le retour sera toujours null. Donc le retour d'un accès à un tableau par sa clé sera toujours nullable. Maintenant voyons comment résoudre ce problème pour ne plus avoir d'alertes :

Conversion dangereuse de type « (Array, Function any>) » vers « () »

Dans ce cas, j'ai une liste d'entier que je veux trier, à priori rien de bien complexe je reprend même l'exemple de la doc

Je me retrouve pourtant avec 2 avertissements sur cette simple ligne, commençons par le premier il est entouré par des parenthèses ce qui signifie que le problème se situe au niveau des paramètres de la fonction qui ne respecte pas la signature attendue. Regardons la documentation de arraySort pour voir sa signature : Function real | integer> => Array> C'est donc une fonction qui attend 2 paramètres, une liste en premier paramètre, et en second paramètre une fonction qui prend aussi 2 paramètres et qui renvoie un entier ou un réél. En premier paramètre on lui passe bien une liste pas de soucis à ce niveau c'est donc au niveau du second paramètre que quelquechose ne va pas, on passe une fonction avec comme signature Function any>, alors que arraySort attend Function real | integer>, le type de retour n'est pas celui attendu.

Le problème de typage de la fonction de callback est résolu, reste maintenant le second avertissement à résoudre. Comme vu juste avant, le retour de la fonction arraySort, n'est pas un Array\ comme on attend pour notre variable mais simplement Array, il faut donc caster le retour explicitement pour corriger ce problème.