web-dev-qa-db-fra.com

Explication appropriée pour l'exportation / importation NodeJS / TypeScript?

Quelqu'un pourrait-il expliquer exactement comment les exportations et les importations fonctionnent dans NodeJS en utilisant Typescript?

Ma configuration est:

  • NodeJS
  • Tout en TypeScript
  • TSLint
  • Dactylographies

Je déconne avec les exportations/importations au lieu de faire un bon codage, ça me rend fou, et je ne trouve aucune explication appropriée de la façon dont cela fonctionne.

Importer

Pouvez-vous s'il vous plaît expliquer ce qui suit:

var module = require ("module");

import module = require("module");

import module from "module";

import {something} from "module";

import * as module from "module";

Exportation

Pouvez-vous s'il vous plaît expliquer ce qui suit

export = something;

export default something;

export interface|class something;

Questions

  • Comment exporter/importer correctement une classe sans l'initier
  • Comment exporter/importer correctement une classe avec son lancement (la construction s'est exécutée)
  • Comment exporter/importer correctement une classe et une interface
  • Comment exporter/importer correctement une classe et plusieurs interfaces
  • Quand utiliser les déclarations de modules, à quoi servent-elles et pourquoi tslint me lance-t-il des erreurs si j'essaye de les utiliser.

Je n'arrive pas à trouver la bonne façon de faire des exportations par rapport aux importations, donc mon IDE n'est pas couvert de rouge et me lance des centaines d'erreurs.

Questions générales

  • Existe-t-il même un moyen de ne pas obtenir d'erreurs en utilisant nodejs/TypeScript/tslint?
  • TSLint me crie dessus pour presque tout ce que je tape ... c'est extrêmement frustrant car il y a 0 explication à la plupart des erreurs. Cela vaut-il même la peine de l'utiliser?

La liste des questions s'allonge encore et encore, mais je suis sûr qu'une fois que certaines des réponses ci-dessus ont été répondues, je peux reprendre le reste.

Merci et désolé pour une question aussi générale, mais mon niveau de frustration vient d'atteindre le sommet ...

30
Tomas

D'accord, la syntaxe d'importation/exportation prête à confusion pour au moins deux raisons:

  • la syntaxe commonjs: var module = require ("module"); fonctionne mais c'est commonjs -> pas de typage
  • ça a changé: la syntaxe import x = require('y') est désormais obsolète dans TS

TL; DR; : Utilisez la syntaxe 'style es6' introduite dans TS 1.5

La "meilleure" ressource sur l'importation/exportation dans TS que je connaisse est this

Dans l'ensemble, je recommande de lire ce excellent manuel qui fournira des réponses à la plupart de vos questions

Importer

À partir d'une exportation par défaut

Something a été exporté comme exportation (unique) par défaut, c'est-à-dire export default Something en ts/es6

Utilisation

import Something from "module"

Vous pouvez réellement importer une exportation par défaut avec un nom différent. import SomethingElse from 'module' fonctionnera également

À partir d'exportations nommées

Something a été exporté en tant qu'export nommé dans "module" à l'aide de export {Something} ou export class|interface Something{} en ts/es6

Vous ne voulez importer que cela, utilisez

import {Something} from "module"    

Vous souhaitez importer tout ce qui est exporté du "module" sous l'espace de noms mod

import * as mod from "module

Utilisez ensuite const c:mod.Something = whatever

Exporter

Voir import ci-dessus

La forme export = something est déconseillé au profit de la nouvelle syntaxe de style ES6. Il se trouve principalement dans les fichiers de définition pour exprimer le fait qu'une bibliothèque js exporte une seule fonction/objet, par exemple module.exports=something.

Ce que vous devez essayer d'utiliser

Utilisez la syntaxe de style ES6 et évitez les exportations default: elles ont l'avantage de pouvoir être importées avec un nom différent mais

  • une importation par défaut ne peut pas être réexportée, ce qui peut être problématique si vous écrivez une bibliothèque
  • ils vont confondre beaucoup d'IDE (sans parler de vous) lors de la refactorisation
  • une exportation nommée peut en fait être renommée localement lors de son importation, c'est-à-dire import {Something as SomethingElse} from "module"

Concrètement, exportez tout ce qui doit être exporté et importez-le spécifiquement

Dans api.ts

export interface MyInterface {
}

export class MyClass {
}

Dans main.ts

 import {MyInterface, MyClass} from './api'

Linting

Il existe de nombreux bons IDE qui offrent un excellent peluchage: VSCode, Atom TypeScript et Webstorm pour n'en nommer que quelques-uns populaires, les deux premiers étant gratuits et le troisième gère même les importations pour vous .

12
Bruno Grieder