727 votes

Impossible de trouver un fichier de déclaration pour le module 'module-name'. Le fichier '/path/to/module-name.js' possède implicitement un type 'any'.

J'ai lu comment TypeScript résolution du module travaux.

J'ai le référentiel suivant : @ts-stack/di . Après la compilation, la structure du répertoire est la suivante :

 dist
    annotations.d.ts
    annotations.js
    index.d.ts
    index.js
    injector.d.ts
    injector.js
    profiler.d.ts
    profiler.js
    providers.d.ts
    providers.js
    util.d.ts
    util.js
 LICENSE
 package.json
 README.md
 src
    annotations.ts
    index.ts
    injector.ts
    profiler.ts
    providers.ts
    util.ts
 tsconfig.json

Dans mon package.json, j'ai écrit "main": "dist/index.js" .

Dans Node.js tout fonctionne bien, mais dans TypeScript :

import {Injector} from '@ts-stack/di';

Impossible de trouver un fichier de déclaration pour le module '@ts-stack/di'. /path/to/node_modules/@ts-stack/di/dist/index.js' possède implicitement un type 'any'.

Et pourtant, si j'importe comme suit, tout fonctionne :

import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';

Qu'est-ce que je fais de mal ?

4 votes

Pour les personnes qui cherchent un endroit où trouver facilement les définitions de type, vous pouvez utiliser la recherche officielle de type TypeScript : typescriptlang.org/dt/search?search=

697voto

ktretyak Points 3284

Voici deux autres solutions

Lorsqu'un module n'est pas le vôtre, essayez d'installer des types à partir de @types :

npm install -D @types/module-name

Si l'installation ci-dessus entraîne des erreurs - essayez de changer import déclarations à require :

// import * as yourModuleName from 'module-name';
const yourModuleName = require('module-name');

23 votes

Si vous obtenez could not find name require, exécutez ceci pour TypeScript 2.0 : npm install @types/node --save-dev

331 votes

Que faire si le module n'a pas le package @types ?

0 votes

@DanielKmak, c'est une bibliothèque de définitions de typescript.

591voto

Retsam Points 734

Si vous importez un module tiers 'foo' qui ne fournit pas de typage, que ce soit dans la bibliothèque elle-même ou dans le fichier @types/foo (généré à partir du DefinitelyTyped ), alors vous pouvez faire disparaître cette erreur en déclarant le module dans un fichier avec une balise .d.ts extension. TypeScript recherche .d.ts aux mêmes endroits que ceux où il cherchera des fichiers normaux. .ts Fichiers : comme spécifié sous "fichiers", "inclure" et "exclure" dans le fichier d'aide à l'écriture. tsconfig.json .

// foo.d.ts
declare module 'foo';

Ensuite, lorsque vous importez foo il sera simplement tapé comme any .


Si vous souhaitez créer vos propres typages, vous pouvez également le faire :

// foo.d.ts
declare module 'foo' {
    export function getRandomNumber(): number
} 

Alors cela compilera correctement :

import { getRandomNumber } from 'foo';
const x = getRandomNumber(); // x is inferred as number

Il n'est pas nécessaire de fournir un typage complet pour le module, juste assez pour les parties que vous utilisez réellement (et pour lesquelles vous voulez un typage correct), ce qui est particulièrement facile à faire si vous utilisez une quantité relativement faible d'API.


D'autre part, si vous ne vous souciez pas du typage des bibliothèques externes et que vous voulez que toutes les bibliothèques sans typage soient importées en tant que any vous pouvez l'ajouter à un fichier avec une balise .d.ts extension :

declare module '*';

L'avantage (et l'inconvénient) de cette méthode est que vous pouvez importer absolument n'importe quoi et que TS compilera.

58 votes

Où le compilateur cherche-t-il d.ts devez-vous fournir une configuration telle que typeRoots ?

24 votes

@Tom Il cherche .d.ts aux mêmes endroits que ceux où il cherchera des fichiers normaux. .ts fichiers : comme spécifié "fichiers", "inclure", et "exclure" dans le fichier tsconfig.json . Je ne recommanderais pas d'utiliser typeRoots à cet effet : il est destiné à l'emplacement des modules de type externe (c'est-à-dire node_modules/@types ), et non les individus .d.ts des fichiers.

13 votes

Pour que ça marche, je devais faire declare module '...' la première ligne de code dans le module.d.ts et inclure les importations dans le bloc du module plutôt qu'avant. Avant que je fasse cela, le compilateur disait qu'il ne pouvait pas trouver le module.

148voto

ktretyak Points 3284

Ce sentiment quand vous regardez pendant deux jours et que vous le trouvez comme ça : il suffit d'enlever .js de "main": "dist/index.js" en package.json et tout fonctionne bien !

"main": "dist/index",

UPD : cette réponse est relative si vous avez votre propre paquet npm, si non - voir ma réponse ci-dessous .

Et si la réponse ci-dessus ne résout pas l'importation de votre module, essayez d'ajouter simplement typings en package.json :

"main": "dist/index",
"typings": "dist/index",

Bien sûr, ici le dossier dist - c'est l'endroit où sont stockés les fichiers de votre module.

3 votes

J'avais un peu de mal avec ça : Quand vous aurez votre propre paquet, assurez-vous de retirer l'ancien contenu de dist de votre paquet (ou tout le dossier node_modules dans votre projet) et exécutez à nouveau votre bundler. Même après cette modification, j'avais toujours de vieux index.js en dist ce qui a provoqué l'avertissement pour moi.

3 votes

Merci pour cela - votre anglais n'était pas très clair mais cela m'a aidé, mon typings était incorrecte. J'ai fait quelques changements pour rendre la réponse plus claire.

0 votes

@optimista J'ai eu des problèmes avec la dist rassis aussi. rm -rf ./dist/* ; tsc

82voto

Marko Rochevski Points 186

TypeScript consiste essentiellement à mettre en œuvre des règles et à ajouter des types à votre code pour le rendre plus clair et plus précis en raison du manque de contraintes en Javascript. TypeScript exige que vous décriviez vos données, afin que le compilateur puisse vérifier votre code et trouver les erreurs. Le compilateur vous fera savoir si vous utilisez des types mal assortis, si vous sortez de votre champ d'application ou si vous essayez de retourner un type différent. Ainsi, lorsque vous utilisez des bibliothèques et des modules externes avec TypeScript, ils doivent contenir des fichiers qui décrivent les types dans ce code. Ces fichiers sont appelés fichiers de déclaration de type avec une extension d.ts . La plupart des types de déclaration pour les modules npm sont déjà écrits et vous pouvez les inclure à l'aide de la commande npm install @types/module_name (où nom_du_module est le nom du module dont vous voulez inclure les types).

Cependant, il existe des modules qui n'ont pas leurs définitions de type et pour faire disparaître l'erreur, il faut importer le module à l'aide de la fonction import * as module_name from 'module-name' créer un dossier typings dans la racine de votre projet, à l'intérieur, créez un nouveau dossier avec le nom de votre module et dans ce dossier, créez un module module_name.d.ts et écrire declare module 'module_name' . Après cela, il suffit d'aller dans votre tsconfig.json et ajouter "typeRoots": [ "../../typings", "../../node_modules/@types"] en el compilerOptions (avec le chemin relatif approprié vers vos dossiers) pour indiquer à TypeScript où il peut trouver les définitions de types de vos bibliothèques et modules et ajouter une nouvelle propriété "exclude": ["../../node_modules", "../../typings"] au fichier. Voici un exemple de ce à quoi devrait ressembler votre fichier tsconfig.json :

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true,
        "outDir": "../dst/",
        "target": "ESNEXT",
        "typeRoots": [
            "../../typings",
            "../../node_modules/@types"
        ]
    },
    "lib": [
            "es2016"
    ],
    "exclude": [
        "../../node_modules",
        "../../typings"
    ]
}

En procédant ainsi, l'erreur disparaîtra et vous pourrez respecter les dernières règles ES6 et TypeScript.

0 votes

Cela n'a fonctionné pour moi que si j'ai nommé le fichier typographique index.d.ts . En dehors de cela, c'est la seule solution qui a fonctionné sur toute la ligne pour moi.

0 votes

Cela a également fonctionné pour moi (je n'ai pas eu besoin de changer le nom en index.d.ts ). Pour ceux qui utilisent la structure d'application par défaut de ng new app-name vous aurez probablement besoin que vos chemins aient un seul niveau, comme ceci : "../node_modules" y "../typings" etc. Assurez-vous également que le module-name partie en declare module 'module_name' est exactement la même que la façon dont vous l'importez dans votre fichier original. Par exemple : dans mon cas, il fallait que ce soit : declare module 'videojs-record/dist/videojs.record.js' car c'est ainsi que je l'importais dans le fichier original.

0 votes

Ne fonctionne pas pour moi

3voto

Kanthavel Points 19

J'ai eu le même problème en utilisant un module node avec une application react écrite en typescript. Le module a été installé avec succès en utilisant npm i --save my-module . Il est écrit en javascript et exporte un Client classe.

Avec :

import * as MyModule from 'my-module';
let client: MyModule.Client = new MyModule.Client();

La compilation échoue avec l'erreur :

Could not find a declaration file for module 'my-module'. 
'[...]/node_modules/my-module/lib/index.js' implicitly has an 'any' type.
  Try `npm install @types/my-module` if it exists or add a new declaration (.d.ts) file containing `declare module 'my-module';`

@types/my-module n'existe pas, j'ai donc ajouté un my-module.d.ts à côté de celui où my-module est importé, avec la ligne proposée. J'ai ensuite obtenu l'erreur :

Namespace '"my-module"' has no exported member 'Client'.

Le client est en fait exporté et fonctionne normalement si je l'utilise dans une application js. De plus, le message précédent me dit que le compilateur cherche dans le bon fichier ( /node_modules/my-module/lib/index.js est défini dans my-module/package.json "main" élément).

J'ai résolu le problème en disant au compilateur que je ne me soucie pas de l'implicite. any c'est-à-dire que j'ai mis à false la ligne suivante du tsconfig.json fichier :

    "noImplicitAny": false,

22 votes

Je veux dire, cela fonctionne mais vous perdez la possibilité de taper strictement le reste de votre code. Ce n'est pas un excellent moyen de contournement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X