@babel/plugin-transform-classes
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Ce plugin est inclus dans @babel/preset-env
Mises en garde
Lors de l'extension d'une classe native (ex. class extends Array {}), la superclasse
doit être encapsulée. Ceci est nécessaire pour contourner deux problèmes :
-
Babel transpile les classes via
SuperClass.apply(/* ... */), mais les classes natives ne sont pas appelables et génèrent donc une erreur dans ce cas. -
Certaines fonctions intégrées (comme
Array) retournent toujours un nouvel objet. Plutôt que de le retourner, Babel doit le traiter comme le nouveauthis.
L'encapsulation fonctionne sur IE11 et tout navigateur disposant d'Object.setPrototypeOf ou de __proto__ en repli.
Il n'existe AUCUNE prise en charge pour IE ≤ 10. Si IE ≤ 10 est requis, il est recommandé de ne pas étendre les natives.
Babel doit statiquement savoir si vous étendez une classe intégrée. Pour cette raison, le "mixin pattern" ne fonctionne pas :
class Foo extends mixin(Array) {}
function mixin(Super) {
return class extends Super {
mix() {}
};
}
Pour contourner cette limitation, ajoutez une classe intermédiaire dans la chaîne d'héritage afin que Babel puisse encapsuler la classe native :
const ExtensibleArray = class extends Array {};
class Foo extends mixin(ExtensibleArray) {}
Exemples
Entrée
class Test {
constructor(name) {
this.name = name;
}
logger() {
console.log("Hello", this.name);
}
}
Sortie
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Test = (function() {
function Test(name) {
_classCallCheck(this, Test);
this.name = name;
}
Test.prototype.logger = function logger() {
console.log("Hello", this.name);
};
return Test;
})();
Installation
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/plugin-transform-classes
yarn add --dev @babel/plugin-transform-classes
pnpm add --save-dev @babel/plugin-transform-classes
bun add --dev @babel/plugin-transform-classes
Utilisation
Avec un fichier de configuration (Recommandé)
// without options
{
"plugins": ["@babel/plugin-transform-classes"]
}
// with options
{
"plugins": [
["@babel/plugin-transform-classes", {
"loose": true
}]
]
}
Via CLI
babel --plugins @babel/plugin-transform-classes script.js
Via l'API Node
require("@babel/core").transformSync("code", {
plugins: ["@babel/plugin-transform-classes"],
});
Options
loose
boolean, valeur par défaut : false.
Envisagez de migrer vers assumptions de niveau supérieur, qui offre un contrôle granulaire sur les diverses déductions du mode loose appliquées par Babel.
{
"assumptions": {
"constantSuper": true,
"noClassCalls": true,
"setClassMethods": true,
"superIsCallableConstructor": true
}
}
Énumérabilité des méthodes
Notez qu'en mode loose, les méthodes de classe sont énumérables. Ceci n'est pas conforme à la spécification et peut causer des problèmes.
Assignation des méthodes
En mode loose, les méthodes sont assignées au prototype de la classe via des affectations simples plutôt qu'être définies. Ceci peut empêcher le fonctionnement de cas comme :
class Foo {
set bar() {
throw new Error("foo!");
}
}
class Bar extends Foo {
bar() {
// will throw an error when this method is defined
}
}
Lorsque Bar.prototype.foo est défini, il déclenche le setter sur Foo. Ce cas est
très improbable en production, mais mérite d'être gardé à l'esprit.
Vous pouvez en savoir plus sur la configuration des options de plugin ici