Type systems are leaky abstractions: the case of Map.take!/2
L’article examine comment ajouter un système de types à un langage dynamique et utilise Map.take!/2 comme exemple des restrictions que les systèmes de types peuvent imposer à l’expressivité des programmes. Il rappelle que Map.take/2 renvoie uniquement les clés présentes et que Map.take!/2 viserait à lever une KeyError si une clé manque, posant ainsi un problème de signature de type plus précise. Des tentatives en TypeScript montrent que des signatures comme Pick et des unions rendent les types fragiles ou insuffisants lorsque les clés varient dynamiquement, menant à des incohérences entre typage et exécution. Différentes pistes sont discutées, notamment des signatures distribuées, as const, et même des macros, qui pourraient garantir la sécurité des clés mais complexifient le système et son ergonomie. Le texte conclut que les programmes dynamiques restent expressifs mais difficiles à vérifier statiquement, et qu’il faut peser les compromis entre expressivité, complexité et outils comme les macros.