web-dev-qa-db-fra.com

L'erreur "Module 'name'" se résout en un module non typé à ... "lors de l'écriture du fichier de définition TypeScript personnalisé

Je ne trouve pas la définition TypeScript @type/{name} Pour l'un de mes packages NodeJS installés. Je tente donc d'écrire un fichier d.ts, Puis de placer le fichier dans le dossier {project root}\typings. Voici comment je fais:

// My source code: index.ts
import Helper from 'node-helper-lib';


// My definition: \typings\node-helper-lib.d.ts
declare....(something else)

declare module 'node-helper-lib' {
   class Helper { ... }
   export = Helper;
}

Cependant, Visual Studio Code continue à générer cette erreur et place une ligne rouge sous declare module 'node-helper-lib':

[ts] Nom de module non valide en augmentation. Le module 'node-helper-lib' se résout en un module non typé dans '{chemin du projet}\noeud_modules\noeud-helper-lib\index.js', qui ne peut pas être augmenté.

N'est-il pas légitime que, parce que la bibliothèque n'est pas typée, je devrais être autorisé à y ajouter du texte?

PDATE:

J'utilise:

  • TypeScript: 2.1.4
  • Code Visual Studio: 1.9.1
  • Nœud JS: 6.9.4
  • Windows 10 x64
51
hirikarate

Après quelques tentatives et erreurs, j'ai trouvé que augmentation signifie "déclarer un module dans le même fichier avec une autre déclaration de module".

Par conséquent, si nous voulons écrire le fichier de définition pour une bibliothèque JavaScript tierce non typée, nous devons avoir SEULEMENT UN declare module 'lib-name' dans ce fichier et 'lib-name' doivent correspondre exactement au nom de la bibliothèque (se trouve dans son package.json, propriété "name").

Par contre, si une bibliothèque tierce possède déjà un fichier de définition.d.ts inclus, et nous voulons étendre ses fonctionnalités, nous pouvons ensuite placer la définition supplémentaire dans un autre fichier que nous créons. Ceci s'appelle augmenting.

Par exemple:

// These module declarations are in same file, given that each of them already has their own definition file.
declare module 'events' {
   // Extended functionality
}

declare module 'querystring' {
   // Extended functionality        
}

declare module '...' { ... }

Je laisse ma découverte ici au cas où quelqu'un aurait la même question. Et corrigez-moi s'il me manque quelque chose.

33
hirikarate

La solution actuelle est donnée dans un commentaire de @Paleo dans la réponse de @ hirikarate:

Les importations doivent être déclarées à l'intérieur de la déclaration du module.

Exemple:

declare module 'node-helper-lib' {
   import * as SomeThirdParty from 'node-helper-lib';
   interface Helper {
       new(opt: SomeThirdParty.Options): SomeThirdParty.Type
   }
   export = Helper;
}
73
Lee Benson

Je recevais aussi ce message d'erreur. Le problème pour moi était que j'essayais de déclarer un autre module dans un fichier de définition de type existant contenant une déclaration de module. Après avoir déplacé la nouvelle déclaration de module dans un nouveau fichier, l'erreur a disparu.

0
G-Wiz

Dans mon cas, je viens d'utiliser la déclaration suivante dans l'un de mes fichiers types afin de pouvoir utiliser tous les packages non-TypeScript:

declare module '*'
0
Alexey