Capire gli avvisi della modalità rigorosa

Capire gli avvisi della modalità rigorosa

> Tutorial LeekScript

Hai deciso di passare alla modalità rigorosa e l'editor ti inonda di avvisi che prima non esistevano. Niente panico: è proprio questo il senso della modalità rigorosa, essere meno permissiva e lasciare meno libertà, soprattutto sulla tipizzazione. Vediamo alcuni casi frequenti di avvisi, per capire innanzitutto qual è il problema segnalato e trovare poi delle soluzioni per rimediare.

Conversion dangereuse de type « real » vers « integer »

Un primo caso semplice: voglio memorizzare il risultato di un calcolo in una variabile di tipo intero.

Il problema qui è che la funzione sqrt restituisce sempre un valore di tipo reale, anche se matematicamente sqrt(4) vale 2. Ma un numero reale non entra senza perdite in una variabile di tipo intero: che fare per esempio dei decimali di sqrt(2)? Il compilatore chiede quindi di fare una scelta esplicita. Esistono diverse soluzioni per risolvere questo avviso:

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

Altro caso: ho un array associativo (Map) di numeri interi definito come segue e voglio memorizzare un valore di questo array associativo in una variabile anch'essa di tipo intero; in teoria i tipi dovrebbero coincidere...

Perché l'avviso ci dice che mapEntier[0] è di tipo «integer?» e non semplicemente «integer»? Come promemoria, il «?» alla fine di un tipo significa che quel tipo accetta anche i valori null: è un equivalente di «integer | null». Ma perché il mio array associativo potrebbe restituirmi un valore null, quando in base al suo tipo contiene solo integer? Quando si vuole leggere un valore in un array associativo bisogna passargli una chiave, qui «0» passato tra parentesi quadre; questa chiave deve essere del tipo definito nell'array associativo, qui un integer, quindi a questo livello va tutto bene. Ma niente garantisce all'editor l'esistenza della chiave nell'array associativo, e se si legge un array associativo con una chiave che non esiste il risultato sarà sempre null. Quindi il risultato di un accesso a un array associativo tramite chiave sarà sempre nullable. Vediamo ora come risolvere questo problema per non avere più avvisi:

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

In questo caso ho una lista di interi da ordinare; a priori niente di complicato, riprendo perfino l'esempio della documentazione

Mi ritrovo però con 2 avvisi su questa semplice riga. Cominciamo dal primo: è racchiuso tra parentesi, il che significa che il problema riguarda i parametri della funzione, che non rispettano la firma attesa. Guardiamo la documentazione di arraySort per vedere la sua firma: Function real | integer> => Array> È quindi una funzione che si aspetta 2 parametri: una lista come primo parametro e, come secondo parametro, una funzione che prende a sua volta 2 parametri e restituisce un intero o un reale. Come primo parametro le passiamo effettivamente una lista, nessun problema a questo livello; è quindi il secondo parametro che non va: passiamo una funzione con firma Function any>, mentre arraySort si aspetta Function real | integer>: il tipo di ritorno non è quello atteso.

Il problema di tipizzazione della funzione di callback è risolto; resta ora da sistemare il secondo avviso. Come visto poco fa, il valore restituito dalla funzione arraySort non è un Array\ come ci aspettiamo per la nostra variabile, ma semplicemente Array: bisogna quindi fare un cast esplicito del risultato per correggere il problema.