J'ai lu comment fonctionne la résolution du module TypeScript .
J'ai le référentiel suivant: @ ts-stack / di . Après avoir compilé 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 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' a implicitement un type 'any'.
Et pourtant, si j'importe comme suit, alors tout fonctionne:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
Qu'est-ce que je fais mal?
typescript
node-modules
ktretyak
la source
la source
npm install @types/node --save-dev
require
place deimport
est un peu anti-pattern: il vaut mieux déclarer le module dans un.d.ts
fichier; voir ma réponse ci-dessous.const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
Si vous importez un module tiers
'foo'
qui ne fournit aucune saisie, ni dans la bibliothèque elle-même, ni dans le@types/foo
package (généré à partir du référentiel DefinitelyTyped ), vous pouvez faire disparaître cette erreur en déclarant le module dans un fichier avec une.d.ts
extension. TypeScript recherche les.d.ts
fichiers aux mêmes endroits qu'il recherchera les.ts
fichiers normaux : comme spécifié sous "fichiers", "inclure" et "exclure" dans letsconfig.json
.Ensuite, lorsque vous importez,
foo
il sera simplement saisi commeany
.Alternativement, si vous voulez rouler vos propres dactylographies, vous pouvez aussi le faire:
Ensuite, cela se compilera correctement:
Vous n'avez pas à fournir des typages complets pour le module, juste assez pour les bits que vous utilisez réellement (et souhaitez des typages appropriés), il est donc particulièrement facile de le faire si vous utilisez une assez petite quantité d'API.
D'un autre côté, si vous ne vous souciez pas des typages des bibliothèques externes et souhaitez que toutes les bibliothèques sans typage soient importées en tant que
any
, vous pouvez l'ajouter à un fichier avec une.d.ts
extension:L'avantage (et l'inconvénient) de cela est que vous pouvez importer n'importe quoi et que TS compilera.
la source
d.ts
t-il les fichiers? devez-vous fournir une configuration telle quetypeRoots
?.d.ts
fichiers aux mêmes endroits qu'il recherchera des.ts
fichiers normaux : comme spécifié "fichiers", "inclure" et "exclure" dans letsconfig.json
. Je ne recommanderais pas d'utilisertypeRoots
à cet effet: c'est destiné à l'emplacement des modules de type externe (c'est-à-direnode_modules/@types
), pas des.d.ts
fichiers individuels ..d.ts
fichier?Si vous avez besoin d'une solution rapide, ajoutez-la simplement avant la ligne de votre importation:
la source
error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
Ce sentiment quand vous êtes à la recherche pendant deux jours et trouvez comme ceci: il suffit de retirer
.js
de"main": "dist/index.js"
danspackage.json
et tout fonctionne bien!UPD : cette réponse est relative si vous avez votre propre package npm, sinon - voir ma réponse ci-dessous .
Et si la réponse ci - dessus pas résolu l' importation de votre module, essayez d' ajouter
typings
danspackage.json
:Bien sûr, ici le dossier
dist
- c'est où stocke les fichiers de votre module.la source
declare module "moduleName"
en attendantTypeScript implémente essentiellement des règles et ajoute des types à votre code pour le rendre plus clair et plus précis en raison de l'absence de contraintes dans Javascript. TypeScript vous oblige à décrire vos données, afin que le compilateur puisse vérifier votre code et trouver des erreurs. Le compilateur vous indiquera si vous utilisez des types incompatibles, si vous êtes hors de votre portée ou si vous essayez de renvoyer un type différent. Ainsi, lorsque vous utilisez des bibliothèques et des modules externes avec TypeScript, ils doivent contenir des fichiers décrivant les types de 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 en utilisantnpm install @types/module_name
(où nom_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 afin de faire disparaître l'erreur et d'importer le module en utilisant
import * as module_name from 'module-name'
, créez un dossiertypings
à la racine de votre projet, à l'intérieur créez un nouveau dossier avec le nom de votre module et dans ce dossier créer unmodule_name.d.ts
fichier et écriredeclare module 'module_name'
. Après cela, allez simplement dans votretsconfig.json
fichier et ajoutez-"typeRoots": [ "../../typings", "../../node_modules/@types"]
lecompilerOptions
(avec le chemin d'accès approprié à 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 l'apparence de votre fichier tsconfig.json:Ce faisant, l'erreur disparaîtra et vous pourrez vous en tenir aux dernières règles ES6 et TypeScript.
la source
index.d.ts
. En dehors de cela, c'était la seule solution qui fonctionnait parfaitement pour moi.Pour toute autre personne lisant ceci, essayez de renommer votre fichier .js en .ts
Modifier: vous pouvez également ajouter
"allowJs": true
à votre fichier tsconfig.la source
Cela fonctionne pour moi:
1. ajoutez votre propre déclaration dans un fichier de déclaration tel que index.d.ts (peut-être sous la racine du projet) 2. ajoutez votre index.d.ts à tsconfig.json- modifier: les guillemets nécessaires autour du nom du module
la source
J'ai eu le même problème en utilisant un module de noeud avec une application de réaction écrite en tapuscrit. Le module a été installé avec succès à l'aide de
npm i --save my-module
. Il est écrit en javascript et exporte uneClient
classe.Avec:
La compilation échoue avec l'erreur:
@types/my-module
n'existe pas, j'ai donc ajouté unmy-module.d.ts
fichier à côté de celui oùmy-module
est importé, avec la ligne suggérée. J'ai alors eu l'erreur:Le client est en fait exporté et fonctionne normalement si je l'utilise dans une application js. En outre, le message précédent m'indique que le compilateur recherche dans le bon fichier (
/node_modules/my-module/lib/index.js
est défini dans l'my-module/package.json
"main"
élément).J'ai résolu le problème en disant au compilateur que je m'en fichais implicitement
any
, c'est-à-dire que je définissaisfalse
la ligne suivante dutsconfig.json
fichier:la source
simple à réparer est:
si vous voulez déclarer l'interface d'objet (recommandé pour un grand projet) vous pouvez utiliser:
Comment l'utiliser? Facile..
la source
J'obtenais cela aussi, m'avait dérouté pendant un certain temps, même avec le module et les types déjà installés et en rechargeant plusieurs fois mon IDE.
Dans mon cas, ce qui a résolu le problème était de mettre fin aux processus terminaux, de supprimer
node_modules
, de vider le cache du gestionnaire de packages de nœuds et de faire un nouveauinstall
chargement, puis de recharger l'éditeur.la source
Malheureusement, il n'est pas de notre ressort si l'auteur du paquet dérange avec un fichier de déclaration. Ce que j'ai tendance à faire, c'est d'avoir un fichier
index.d.ts
qui contiendra tous les fichiers de déclaration manquants de divers packages:Index.ts:
la source
C'est ce qui a fonctionné de moi.
npm install --save readline
la source
J'ai tout essayé ici, mais pour moi, c'était un problème complètement différent: j'ai dû supprimer de mes
*.d.ts
déclarations d'importation:Après avoir supprimé l'erreur est parti ...
Clarification : lorsque nous déclarons un module dans un
*.d.ts
fichier, il est automatiquement récupéré par le compilateur Typescript en tant que module ambiant (celui que vous n'avez pas besoin d'importer explicitement). Une fois que nous avons spécifié leimport ... from ...
, le fichier devient maintenant un module normal (ES6), et ne sera donc pas récupéré automatiquement. Par conséquent, si vous souhaitez qu'il se comporte comme un module ambiant , utilisez un style d'importation différent comme ceci:la source
Vous pouvez simplement l'importer en utilisant require comme code suivant:
la source