Typescript: typeRoots ne trouve pas de fichier de déclaration personnalisée

Créé le 28 févr. 2018  ·  15Commentaires  ·  Source: microsoft/TypeScript



Version TypeScript:
Version 2.6.2


Termes de recherche:
fichier de déclaration pour la fonction d'exportation de module, module externe, package npm, module tiers

Code
src/testFile.ts :

import getFieldList = require('graphql-list-fields');

src/@types/graphql-list-fields/index.d.ts :

// Doing just this below (as suggested by the Typescript Handbook does not work 
// and results in the tsc error under **Actual behavior** below
import { GraphQLResolveInfo } from 'graphql';
declare function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;

// The code below is what actually works instead of the above
/*
declare module 'graphql-list-fields' {
    import { GraphQLResolveInfo } from 'graphql';
    function getFieldList(info: GraphQLResolveInfo): string[];
    export = getFieldList;
}
*/

Comportement prévisible:
Compiler sans erreurs.

Comportement réel:
Erreur lors de l'exécution de tsc :

src/testFile.ts(1,31): error TS7016: Could not find a declaration file for module 'graphql-list-fields'. '/node_modules/graphql-list-fields/index.js' implicitly has an 'any' type.
Try `npm install @types/graphql-list-fields` if it exists or add a new declaration (.d.ts) file containing `declare module 'graphql-list-fields';`

graphql-list-fields est un package NPM que j'essaie d'utiliser, qui n'a actuellement aucune déclaration de type publiée.

Après avoir lu la section du manuel Typescript sur les fichiers de déclaration, j'ai trouvé que j'essayais d'écrire un fichier de déclaration pour une bibliothèque modulaire et que je devais utiliser le modèle de fichier de déclaration module-function.d.ts . C'est ainsi que j'ai trouvé le code dans index.d.ts ci-dessus, mais le compilateur se plaint toujours de ne pas avoir le fichier de déclaration pour le module 'graphql-list-fields'. Après essais et erreurs, nous avons constaté que l'ajout de declare module 'graphql-list-fields' autour de tout fonctionnait sans erreurs du compilateur.

Nous avons essayé de définir "typeRoots": ["./node_modules/@types", "./src/@types"] dans tsconfig.json , comme mentionné dans la documentation tsconfig, mais cela ne fonctionnait toujours pas sans declare module 'graphql-list-fields' . Cela semble être un problème car tsc ne trouve pas la déclaration de type dans les répertoires spécifiés dans typeRoots.

Problèmes liés:
3019 , 8335

Question

Commentaire le plus utile

TypeRoots est vraiment un support que nous avons ajouté pour la compatibilité avec les

@mhegazy Avoir une fonctionnalité prise en charge avec peu ou pas de documentation est ce qui crée la confusion. Veuillez documenter correctement les fonctionnalités comme celle-ci, mais soyez libéral avec votre langage d'avertissement. Par exemple:

_ Remarque: cette fonctionnalité est fournie pour la compatibilité ascendante avec les typages pour prendre en charge la migration. Consultez les notes de version [ici] pour plus d'informations._

Ce serait _vastly_ préférable d'avoir à analyser les problèmes GitHub, StackExchange, etc. pour plus d'informations.

Tous les 15 commentaires

"typeRoots" est destiné au code global. c'est-à-dire quelque chose qui est déclaré dans l'espace de noms global, et que vous souhaitez l'inclure. c'est pourquoi votre declare module 'graphql-list-fields' {.. fonctionne, car il déclare simplement un module avec ce nom dans l'espace de noms global.

Pour les modules, ils ont leur propre portée, tout ce dont vous avez besoin est un mappage de chemin.

quelque chose comme:

{
    "compilerOptions": {
        "target": "es5",
        "baseUrl": "./",
        "paths": {
            "*" : ["src/@t`ypes/*"]
        }
    }
}`

Merci d'avoir clarifié cela @mhegazy. Je pense qu'il serait utile que cela soit expliqué plus en détail dans la documentation TypeScript, éventuellement dans la section des fichiers de déclaration .

TypeRoots est vraiment un support que nous avons ajouté pour la compatibilité avec les

Je ne sais pas si cela correspond à la section du fichier de déclaration. nous avons une note à ce sujet dans https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -mapping

Je peux ajouter une note dans la section du fichier de déclaration sur la section de résolution de module dans son ensemble.

Lisez cette section et faites-nous savoir si vous trouvez encore des documents manquants

Oh je vois. Ouais, c'est la page dont j'avais besoin pour commencer. Je pense que ce serait bien d'avoir au moins une brève mention du mappage de chemin et peut-être un lien vers ce document quelque part sous https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html.

Clôture automatique de ce problème à des fins d'entretien ménager. Les libellés de problème indiquent qu'il ne peut pas être utilisé pour le moment ou qu'il a déjà été résolu.

Je pense toujours qu'il serait utile de mettre à jour les documents comme indiqué dans mon commentaire précédent @ typescript-bot

TypeRoots est vraiment un support que nous avons ajouté pour la compatibilité avec les

@mhegazy Avoir une fonctionnalité prise en charge avec peu ou pas de documentation est ce qui crée la confusion. Veuillez documenter correctement les fonctionnalités comme celle-ci, mais soyez libéral avec votre langage d'avertissement. Par exemple:

_ Remarque: cette fonctionnalité est fournie pour la compatibilité ascendante avec les typages pour prendre en charge la migration. Consultez les notes de version [ici] pour plus d'informations._

Ce serait _vastly_ préférable d'avoir à analyser les problèmes GitHub, StackExchange, etc. pour plus d'informations.

Thx une putain de tonne @mhegazy ! : tada: Cette entrée de chemin pour @types était finalement la pièce manquante qui a fait fonctionner ma configuration de projet non standard. J'ai passé des jours là-dessus.

Si cela ne vous dérange pas de ralentir peu le processus de démarrage de votre application, vous pouvez simplement ajouter TS_NODE_FILES=true au script de démarrage de votre package.json et tout le fichier de déclaration personnalisé sera trouvé.

Je reçois maintenant:

The following changes are being made to your tsconfig.json file:
  - compilerOptions.paths must not be set (aliased imports are not supported)

et cette option est en cours de suppression.

@KrzysztofMadejski qui est fait par CRA, pas TS lui-même.

Ce fil dit que les racines de caractères sont vraiment destinées à la compatibilité ascendante. J'essaye de l'utiliser pour créer des types pour une saisie définitive. Sinon, comment pourrais-je tester correctement ces types sans racines de caractères? J'ai généré des types en utilisant dts-gen et ajouté types à mes racines de types et toujours pas de chance :-(

@Roaders avez-vous trouvé la solution pour utiliser les types générés par dts-gen ?

Edit: résolu avec https://github.com/microsoft/TypeScript/issues/22217#issuecomment -369783776

Une chose que je ne comprends pas ici est que:

tsconfig.base.json:

"typeRoots": ["node_modules/@types", "types"],

Et une structure de répertoires:

/node_modules/@types/something/index.d.ts
/types/something-else/index.d.ts

Il ne sera pas du tout récupéré dans mon référentiel nrwl / nx. Je peux essayer un million de choses mais si je déplace ce dossier something-else dans node_modules/@types cela fonctionnera comme par magie et sera ramassé, ce qui suggère que typeRoots ne fait absolument rien comme node_modules/@types est géré par magie.

Marquer typeRoots comme obsolète et dire que cela fonctionne d'une manière étrange / décalée m'aurait au moins empêché d'essayer de l'utiliser.

La seule façon dont j'ai réussi à ajouter des types locaux chaque fois que j'en ai besoin, est de passer des heures à me battre avec mon tsconfig.base.json et à tomber sur le commentaire mhegazy ci-dessus

Je n'arrêtais pas d'être mordu par cela et d'oublier de devoir également configurer l'option paths , alors j'ai créé un référentiel simple avec les paramètres appropriés. J'espère que ça aide quelqu'un.

Cette page vous a été utile?
0 / 5 - 0 notes