Pièges des espaces de noms et des modules
Dans cette section, nous décrivons divers pièges courants liés à l'utilisation d'espaces de nommage et de modules, ainsi que la manière de les éviter.
/// ‹reference›-ing un module
Une erreur courante consiste à utiliser la syntaxe
/// ‹reference ... /›
pour faire référence à un fichier de module, plutôt que d'utiliser une instruction
import
.
Pour comprendre la distinction, nous devons d'abord comprendre comment le compilateur peut localiser les informations de type d'un module en fonction du chemin d'un
chemin import (par exemple , ...in
import x from "...";
,
import x = require("...");
etc.)...
Le compilateur essaiera de trouver un
.ts
,
.tsx
puis un
.d.ts
avec le chemin approprié.
Si un fichier spécifique est introuvable, le compilateur recherchera une déclaration de module ambiante.
Rappelons que ceux-ci doivent être déclarés dans un fichier
.d.ts
.
myModules.d.ts
myOtherModule.ts
La balise de référence ici nous permet de localiser le fichier de déclaration contenant la déclaration du module ambient.
Voici comment le fichier
node.d.ts
utilisé par plusieurs exemples
TypeScript
est utilisé.
Nom de domaine inutile
Si vous convertissez un programme d'espaces de noms en modules, il peut être facile de vous retrouver avec un fichier qui ressemble à ceci :
shapes.ts
Le module de niveau supérieur ici
Shapes
enveloppe
Triangle
et
Square
sans aucune raison.
Ceci est déroutant et gênant pour les utilisateurs de votre module :
shapeConsumer.ts
Une caractéristique clé des modules dans
TypeScript
est que deux modules différents ne contribueront jamais à des noms du même domaine.
étant donné que le consommateur d'un module décide du nom à lui attribuer, il n'est pas nécessaire d'encapsuler de manière proactive les symboles exportés dans un espace de noms.
Pour rappeler pourquoi vous ne devriez pas essayer d'espacer le contenu de votre module en espace de noms,
l'idée générale est de fournir un regroupement logique des constructions et d'éviter les conflits de noms.
Comme le fichier de module lui-même constitue déjà un groupe logique et que son nom de niveau supérieur est défini par le code qui l'importe,
il est inutile d'utiliser une couche de module supplémentaire pour les objets exportés.
Voici un exemple révisé :
shapes.ts
shapeConsumer.ts
Compromis des modules
Tout comme il existe une correspondance un à un entre les fichiers JS et les modules,
TypeScript
dispose d'une correspondance un à un entre les fichiers source du module et les fichiers JS qu'ils émettent.
Cela a notamment pour effet qu'il est impossible de concaténer plusieurs fichiers source de module en fonction du système de module que vous ciblez.
Par exemple, vous ne pouvez pas utiliser l'option
outFile
pendant le ciblage
commonjs
ou
umd
, mais avec
TypeScript 1.8
et versions ultérieures,
il est possible de l'utiliser
outFile
lorsque vous ciblez
amd
ou
system
.