Per chi proviene da un linguaggio fortemente tipizzato come Java, imparare JavaScript è molto più difficile di quanto non si pensi. Questo perché JavaScript è un linguaggio debolmente tipizzato in cui la conversione tra tipi di dati avviene implicitamente (casting implicito). I programmatori JavaScript spesso sfruttano questa caratteristica a loro favore, ma per gli altri è un problema.
Consideriamo la seguente funzione che somma due numeri:
'use strict';
const sum = (a, b) => {
return a + b;
};
Ecco come si comporta JavaScript:
Codice | Tipi di dati | Risultato | Tipo del risultato |
---|---|---|---|
sum(1, 2) |
Numero, numero | 3 | Numero |
sum('1', 2) |
Stringa, numero | 12 | Stringa |
sum(true, 2) |
Booleano, numero | 3 | Numero |
sum(undefined, 2) |
undefined, numero | NaN | NaN |
sum(null, 2) |
null, numero | 2 | Numero |
Una soluzione a questo problema è quella di verificare sempre se il tipo di dati passato è corretto:
if(typeof a === 'number' && typeof b === 'number') {
// eseguo l'operazione
}
Un'altra soluzione, meno affidabile, è quella di eseguire il casting in modo esplicito:
const n1 = Number(a);
const n2 = Number(b);
Tuttavia nel caso del valore undefined
questa soluzione peggiora il problema. È sempre meglio verificare in anticipo il tipo
di dati per evitare sorprese.
TypeScript fornisce una soluzione al problema introducendo la tipizzazione esplicita e la verifica su di essa:
const sum = (a: number, b: number) => {
return a + b;
};
Ma una volta compilato il codice in JavaScript, ovviamente, la tipizzazione esplicita viene meno.