Auparavant je pouvais faire:
import foo = require('foo');
Mais maintenant que TypeScript (1.5) prend en charge la syntaxe de module es6, quelle est la bonne façon d’obtenir la même chose dans la syntaxe de module ES6?.
La bonne façon est de continuer à utiliser l'ancienne syntaxe d'importation. La nouvelle syntaxe d'importation concerne uniquement les modules ES et l'ancienne syntaxe d'importation concerne les modules antérieurs à ES6. Les deux sont distincts, intentionnellement. import * as foo from 'foo'
importe tous les propriétés du module 'foo', il n'importe pas la valeur par défaut sous la forme foo
.
Du concepteur de la fonctionnalité :
export default
a toujours la sémantique du module ES. Pour assurer la compatibilité avec Babel, nous pourrions éventuellement émettre un marqueur __esModule
lorsqu'un module a une exportation par défaut, mais nous n'utiliserions en fait ce marqueur pour rien.export =
, qui substitue une entité différente à exporter à la place du module lui-même, est toujours émise sous forme d'affectation à module.exports
. C'est une erreur d'avoir d'autres exportations dans un module qui utilise export =
. C'est le comportement TypeScript existant.export =
pour exporter un autre module (qu’il s’agisse d’un module interne ou externe) peut être importé à l’aide des nouvelles constructions ES6. En particulier, les importations de déstructuration pratiques peuvent être utilisées avec ces modules. Le modèle d'utilisation de export =
pour exporter un autre module est courant dans les fichiers .d.ts qui fournissent une vue CommonJS/AMD d'un module interne (par exemple, angular.d.ts).export =
pour exporter une entité autre que le module à la place du module lui-même doit être importé à l'aide de la syntaxe import x = require("foo")
existante, comme c'est le cas aujourd'hui.Mise à jour 2016: Le compilateur TypeScript a commencé à permettre à import * as foo from 'legacy-module-foo'
d'obtenir l'importation par défaut d'un module hérité dans certaines circonstances. Ceci est une violation de la spécification ES6 ( §15.2.1.16 , "La valeur" * "indique que la demande d'importation concerne l'objet de nom de l'espace de nom du module cible .").
Lorsque les modules existants que vous importez de cette manière sont mis à jour vers les modules ES6, les importations «par défaut» de ces modules cesseront de fonctionner (car les importations * as foo
sont supposées être importées objets d'espace de nom) ce qui peut être extrêmement déroutant si vous ne savez pas que cela est un hack TypeScript/SystemJS. Il est également possible qu'un futur réalignement de TypeScript sur la spécification ES provoque leur rupture.
En tant que tel, vous devriez probablement préférer continuer à utiliser la syntaxe d'importation héritée décrite ci-dessus pour charger des modules hérités afin d'éviter toute confusion avec les autres développeurs travaillant sur votre code sur le fonctionnement des importations d'espace de noms ES6 et avec des modifications incohérentes.
La syntaxe correspondante pour la syntaxe du module ES6 est la suivante:
import * as foo from 'foo';
Importez fondamentalement tout du module foo
dans une variable locale portant le nom foo
.
Les modules ES6 sont en réalité des modules externes TypeScript avec un nouveau fichier syntaxe: les modules ES6 sont des fichiers sources chargés séparément, éventuellement importer d'autres modules et fournir un certain nombre d'éléments accessibles de l'extérieur exportations. Les modules ES6 comportent plusieurs nouvelles exportations et importations déclarations. Il est recommandé d'utiliser les bibliothèques TypeScript et les applications soient mises à jour pour utiliser la nouvelle syntaxe, mais ce n'est pas un exigence.
Autant que je sache, cela signifie que vous êtes encouragé à migrer vos propres modules TypeScript vers la nouvelle syntaxe, mais continuez à utiliser import foo = require('foo')
pour importer les modules AMD/CommonJS réels.
Une autre option consiste à l'importer en utilisant la syntaxe commonjs:
const foo = require("foo");
TypeScript et Bable conviennent tous les deux de ce qu'il faut faire avec cela. De plus, si vous compilez jusqu'à ES5 ou moins, cela ne sera pas trop éloigné de sa forme finale.
A partir de TypeScript 2.7 , un nouvel indicateur esModuleInterop
peut être utilisé pour activer les importations par défaut avec CommonJS/AMD/UMD. En définissant cet indicateur sur true
dans votre tsconfig.json
, cela devrait fonctionner comme prévu:
import foo from 'foo';
tout importer,
const foo = require("foo");
cela importera toutes les occurrences du paquet "foo" si c'est un fichier alors
const foo = require("./foo");
afin que vous puissiez accéder à chaque instance en appelant, foo.InstanceName
si vous voulez importer une instance spécifique,
import MyInstance from "foo";
donc cela importera une instance spécifique (Myinstance) de "foo" vous pouvez toujours tout importer en utilisant la méthode ci-dessus,
import * as ReferenceName from "foo";
son équivalent à,
const ReferenceName = require("foo");