La nouvelle mouture de JavaScript pour 2025 va apporter de belles fonctionnalités, en particulier certaines qui vont ravir les amateurs de TypeScript.
Si on suit les numéros de version EcmaScript, 2024 a vu la version 15, nous serons donc sûrement à la version 16 pour 2025.
L'objectif de JavaScript est toujours de pouvoir devenir un standard du développement web.
Les fonctionnalités de JavaScript pour 2025
Les collections immuables
Devenant vitales dans le développement moderne, l'immuabilité n'existe pas vraiment en JavaScript. Il faut ruser, utiliser une librairie externe ou utiliser TypeScript.
La version 16 de JavaScript va apporter des collections immuables, via les Set et les Map, qui pourront être des ImmutableSet et ImmutableMap.
Ce type d'objet ne permettra pas la modification après création.
Pattern Matching
Une des fonctionnalités les plus attendues, elle va ravir les ennemis des switch ... case.
Ce type de design pattern pourra se présenter comme tel :
const result = match (userInput) {
{ type: 'number', value: x } => `It's a number: ${x}`,
{ type: 'string', value: x } => `It's a string: ${x}`,
_ => 'Unknown type',
};
Application partielle et currying
Une question se pose quand on veut utiliser une fonction avec un paramètre fixe. Par exemple :
function buildUri (scheme, domain, path) {
return `${scheme}://${domain}/${path}`
}
const twitterFavicon = buildUri('https', 'twitter.com', 'favicon.ico')
const googleFavicon = buildUri('https', 'google.com', 'favicon.ico')
// Avec http
const httpWebsiteFavicon = buildUri('http', 'httpwebsite.com', 'favicon.ico')
Ici, on constate qu'on voudrait pouvoir fixer le premier paramètre de la fonction pour pouvoir l'utiliser.
const R = require('ramda')
const buildHttpsUri = R.partial(buildUri, ['https'])
const buildHttpUri = R.partial(buildUri, ['http'])
// ou avec currying sans rambda
function buildUri (scheme) {
return function (domain) {
return function (path) {
return `${scheme}://${domain}/${path}`
}
}
}
const buildHttpsUri = buildUri('https')
const buildHttpUri = buildUri('http')
Dans la prochaine mouture de JavaScript, la fonctionnalité d'application partielle sera gérée nativement.
Enregistrements et tuples étendus
Les enregistrements et les tuples sont des types de données profondément immuables et structurellement uniques. Introduits à titre expérimental, la norme ES2025 devrait étendre leurs capacités.
const record = #{ a: 1, b: 2 }; // Record
const tuple = #[1, 2, 3]; // Tuple
Ce type d'enregistrements permet d'obtenir des structures immuables de données parfaites pour les frameworks modernes.
Propagation asynchrone de contexte
Passer une valeur issue d'une promesse dans un contexte est assez complexe et doit utiliser des systèmes de gestion d'état.
import { AsyncContext } from 'async-context';
const context = new AsyncContext();
context.run(() => {
context.set('user', { id: 42 });
asyncOperation().then(() => {
console.log(context.get('user')); // { id: 42 }
});
});
La prochaine version de JavaScript va permettre de passer des valeurs de promesses dans un contexte de manière plus simple.
Opérateur pipe
Central dans la programmation fonctionnelle, le tube d'exécution (pipeline) permet de chaîner les fonctions les unes aux autres.
Voir l'article spécifique sur la programmation fonctionnelle.
const result = userInput
|> parse
|> validate
|> saveToDatabase;
En ajoutant le chaînage nativement, JavaScript s'ouvre à la programmation fonctionnelle.
JSON modules standardisés
Les modules JSON permettent d'importer des objets JSON nativement et de les utiliser en JavaScript.
import config from './config.json' assert { type: 'json' };
console.log(config.title);
Dans la prochaine version, il sera possible d'importer ces modules sans passer par des librairies comme fs avec Node.js.