Appearance
Classes ES2020 plutôt que prototypes ES5
Le cœur est écrit en classes JavaScript natives, avec des champs et des méthodes, au lieu de déclarer chaque classe en TypeScript puis de l'implémenter à la main sur Function.prototype. Le seuil de détection de cycle est traité comme un paramètre d'implémentation et non comme une constante contractuelle.
Considered Options
- Reproduire le style de la baseline —
declare classpour le typage, puis fonctions et prototypes à la main. Refusé. Sa justification upstream est explicite dans sa source : « better control of the transpiled output size ».signalcnne transpile pas — Node 24 exécute le TypeScript directement et la cible est ES2020 — donc la raison ne s'applique pas, et le style ne coûte que de la lisibilité. - Écrire un prototype à la main pour préserver l'énumérabilité — refusé. Les méthodes d'une classe native sont non énumérables, celles d'un prototype écrit à la main le sont. Forcer l'énumérabilité exposerait des méthodes comme des données, et aucun outil ne s'appuie sur cette propriété pour fonctionner.
Consequences
for..inrétrécit. Huit clés sur un signal au lieu de dix-sept, douze sur un computed au lieu de vingt-deux.Object.keys(Computed.prototype)est vide au lieu de douze noms de champs. C'est l'écart le plus visible en comparant les deux bibliothèques côte à côte.- L'empoisonnement global du prototype disparaît. Dans la baseline,
Computed.prototypeest une instance deSignal— donc un objet partagé, mutable et vivant — et lire.valuedessus lève uneTypeErrorqui le condamne pour tous les computeds du même realm. Avecclass Computed extends Signal, le prototype estSignal.prototype, sans état. Le quirk le plus inquiétant du rapport d'inventaire n'existe plus. Computed.prototype.constructordevient correct :Computed, au lieu deSignal.- Le seuil de cycle cesse d'être contractuel.
SPEC.md§15.2 exige désormais qu'un cycle asynchrone finisse enErrordans un nombre borné d'itérations, sans figer le compte. C'est cohérent avec l'analyse : cent est un ordre de grandeur, pas une constante sémantique, et la détection exacte de cycle serait indécidable. - L'ordre des huit propriétés-own d'un signal ne change pas, donc
Object.keys,{...signal}etJSON.stringifyrestent compatibles. C'est la surface qui comptait réellement. - Ces écarts sont consignés dans
SPEC.md§21 et détaillés danssite/technique/architecture.md§11.