2017-07-10 1 views
1

Je crée une application Web qui repose sur PDFKit. PDFKit peut fonctionner dans le navigateur en utilisant Webpack. Comme j'utilise Typescript avec Webpack, j'inclus les définitions @types/node pour que mes interfaces avec PDFKit fonctionnent correctement. Cela provoque d'autres parties de l'application qui utilisent des globales de navigateur (par exemple Timer) ou des globales d'exécution Webpack (par exemple require) où les typages ne sont pas identiques à Node pour renvoyer des erreurs.Résoudre les conflits de typage avec les bibliothèques dépendant du nœud dans Webpack + Typescript

Est-ce que quelqu'un a des idées pour une manière propre d'isoler le typage de nœud aux fichiers où ils sont nécessaires? Dans le passé, je l'ai éparpillé any au besoin - par exemple:

(require as any).ensure(...); // require has no method 'ensure' in Node 
let tmr: number = setTimeout(...) as any; // returns a 'Timer' in Node 

C'est juste laid et insoutenable. Y a-t-il un meilleur moyen?

Répondre

0

Pour contourner ce problème, vous pouvez désactiver require en tapant depuis le noeud.

Définissez typeRoots explicitement dans votre tsconfig.json. Dans ce cas, le dossier @types ne sera plus utilisé pour rechercher des types. Dans votre racine de type personnalisé, vous pouvez créer un fichier index.d.ts avec /// références à des typonymes à partir de @types (sauf node.d.ts). Vous pouvez également fournir une version personnalisée modifiée de node.d.ts dans votre racine de saisie personnalisée.

Pas une meilleure solution. Inconvénients sont évidents: vous devez maintenir une certaine façon des références et version personnalisée de typage noeud :)

(plus d'infos sur typeRoots voir http://www.typescriptlang.org/docs/handbook/tsconfig-json.html)

Mise à jour:

Encore une réponse trouvée ici: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11324#issuecomment-265046822

Vous pouvez créer des fichiers tsconfig.json distincts pour chaque groupe de fichiers utilisant un noeud et non. Vous pouvez y sélectionner explicitement les types que vous souhaitez appliquer dans le groupe. Vous devez toujours gérer un ensemble de noms de frappe, mais il est beaucoup plus petit.