/ / Référençant indirectement deux fois des modules égaux - compiler-errors, typescript

Référence indirecte à deux modules égaux - Compiler-errors, typescript

J'ai la structure de fichier suivante:
(Vous pouvez cloner mon Repo GitHub reproduire l'erreur.)

client.ts
|
|-- references lib-a/lib-a.ts
|             |
|             |-- references lib-a/lib-c.d.ts
|
|-- references lib-b/lib-b.ts
|
|-- references lib-b/lib-c.d.ts (equal to lib-c.d.ts)

lib.c.d.ts:

declare module "lib-c" {
interface LibC {
dummyAttribute: number;
}
}

Compiler client.ts conduit évidemment à une erreur parce que le même DummyAttribute est déclaré deux fois.

lib-b/lib-c.d.ts(3,9): error TS2300: Duplicate identifier "dummyAttribute".

Existe-t-il un moyen de forcer le compilateur TypeScript à ignorer cette erreur ou à "limiter" la recherche de doublons à un niveau?

Sans toucher au compilateur, je ne peux qu’imaginer une solution qui aboutirait à une situation où lib-a et lib-b désignent le même (pas à égalité) lib-c fichier. Ceci est possible via:

  1. Changer de lib-a ou lib-b. Ceci est un hack sale car les mises à jour écraseront les modifications.
  2. Suppression lib-a/lib-c.d.ts et en plaçant un lien symbolique pour pointer vers lib-b/lib-c.d.ts.

Le point 1 fonctionne, bien sûr.
Le point 2 n’a pas fonctionné pour moi. Après avoir exécuté mklink lib-b/lib-c.d.ts lib-a/lib-c.d.ts (sous Windows), le compilateur TypeScript produit toujours le même message identifiant en double Erreur.

Comment puis-je référencer deux modules référençant égaux (mais pas le même) dépendances elles-mêmes?

Réponses:

3 pour la réponse № 1

La solution consiste à s'assurer que les dépendances sont gérées de manière prévisible.

Par exemple, si vous utilisez .d.ts fichiers de Definitely Typed et les charger via NuGet, ils utilisent des dépendances de paquets pour vous assurer de ne recevoir qu'une copie de chaque dépendance.

Prenons jQuery comme exemple.

Si nous assemblions jQuery avec chaque bibliothèque qui en avait besoin, nous nous retrouverions exactement dans la situation que vous décrivez:

- /Scripts
- - /jqueryui
- - - jquery.ui.d.ts
- - - jquery.d.ts
- - /jquerymobile
- - - jquerymobile.d.ts
- - - jquery.d.ts

Cela pose un problème car cela introduitdéfinitions en double. Dans le cas où "elles sont toutes deux la même bibliothèque", vous pourriez peut-être dire que vous voulez les ignorer, mais si deux bibliothèques entièrement différentes se disputaient le même nom dans l'espace de noms global, vous rencontrerez des problèmes d'exécution.

Pour résoudre le cas que vous décrivez, lors de l'installation des packages NuGet pour jQuery UI et jQuery mobile (comme dans l'exemple ci-dessus), vous obtenez le résultat suivant:

- /Scripts
- - /jqueryui
- - - jquery.ui.d.ts
- - /jquerymobile
- - - jquerymobile.d.ts
- - /jquery
- - - jquery.d.ts

Et c'est la bonne façon de partager une dépendance.

Cette structure est également reflétée dans le référentiel Definitely Typed. Ainsi, jQuery UI et jQuery Mobile pointent vers la même définition relative jQuery.

Je ne suis pas sûr de savoir comment quelque chose peut être égal mais nonle même "que dans votre question - vous avez peut-être des bibliothèques dépendant de versions différentes de la même chose ... la réponse à cette question dépendra en grande partie de la façon dont vous résolvez le problème d'exécution (par exemple, si vous utilisez deux versions de jQuery, vous attribuez probablement une version à un nom différent dans la portée globale pour éviter le conflit, auquel cas vous aurez également besoin d’une version modifiée de jquery.d.ts portant ce nom global).