node.js - Hvordan bruke npm-moduler fra TypeScript?


Jeg prøver meg på TypeScript. Det fungerer bra på «hello world»-stadiet. Jeg prøver nå å bruke en npm-modul:

index.ts =

import _ = require('lodash')

console.log(_.toUpper('Hello, world !'))

Dette fungerer ikke :

  • tsc index.ts -> Kan ikke finne modul 'lodash'. (2307)
  • node-ts index.js -> Kan ikke finne modul 'lodash'. (2307)

Å se på TypeScript-dokumentasjonen og på Google hjalp ikke. Andre S/O-spørsmål er enten ubesvarte (her og her) eller ikke relevante.

Elementer :

  • typescript 1.8 siste
  • Ja, lodash er installert npm i --save lodash og finnes på mitt filsystem (sjekket)
  • Jeg gjorde også typings i --save lodash
  • varianter import * as _ from 'lodash' eller const _=require('lodash') fungerer heller ikke
  • Jeg prøvde å justere tsconfig.json-alternativene som foreslått i andre svar "moduleResolution": "node" og "module": "commonjs" som foreslått i noen svar, det fungerer fortsatt ikke

Hvordan bruker vi en npm-pakke i TypeScript?

Svar #1

[2018/12] Ny, oppdatert, svar på dette spørsmålet jeg stilte i 2016, som fortsatt viser mye aktivitet til tross for å ha utdaterte svar.

Kort fortalt krever TypeScript typeinformasjon om koden i pakken din (også kjent som «typeerklæringsfiler» eller «typings») og forteller deg med rette at du ellers ville gå glipp av hele poenget med TypeScript. Det finnes flere måter å levere dem på eller velge å ikke bruke dem, listet her i rekkefølge etter beste praksis:

Løsning 0: modulen gir allerede typene. Hvis dens package.json inneholder en linje som denne:

"typings": "dist/index.d.ts",

det er allerede TypeScript-aktivert. Det er mest sannsynlig ikke tilfelle hvis du leser denne siden, så la oss fortsette...

Løsning 1: bruk fellesskapsbidratt typinger fra DefinitelyTyped. For en modul "foo", prøv dette:

npm add -D @types/foo

hvis det fungerer, jackpot! Du har nå typene og kan bruke modulen din. Hvis npm klager på at det ikke finner modulen @types/foo, la oss fortsette...

Løsning 2: gi tilpassede typer for dette modulen. (med en mulighet for å gjøre null innsats)

  1. Opprett en mappe med navnet "typings-custom" i roten av prosjektet ditt
  2. Referer innholdet i denne mappen i din tsconfig.json:
"include": [
    "./typings-custom/**/*.ts"
]
  1. Opprett en fil med dette eksakte navnet: foo.d.ts [foo=navnet på modulen] med innholdet:
declare module 'foo'

Din TypeScript-kode bør nå kunne kompileres, selv om det ikke finnes NOEN typeinformasjon (TypeScript vurderer foo-modulen som typen "any").

Du kan også forsøke å skrive typeinformasjonen selv, ved å se på den offisielle dokumentasjonen og/eller på eksempler fra DefinitelyTyped. Hvis du gjør det, vurder å bidra med dine typings enten direkte inn i modulen (løsning 0, hvis moduleskaperen godtar det) eller inn i DefinitelyTyped (løsning 1)

Svar #2

[REDIGER] Tusen takk for dette svaret! Men per 2018 er det utdatert. Lesere, ta en titt på de andre svarene.

Det finnes flere måter å importere moduler fra npm på. Men hvis du ikke får typings, vil tsc alltid klage på at den ikke finner modulen du krever (selv om transpilert js faktisk fungerer).

  • Hvis du har typings og ikke bruker en tsconfig.json, bruk reference for å importere typene:

    /// <reference path="path/to/typings/typings.d.ts" />
    
    import * as _ from 'lodash`;
    
    console.log(_.toUpper('Hello, world !'))
    
  • Hvis du bruker en tsconfig.json-fil, vær sikker på at typings-filen din er inkludert (eller ikke ekskludert, ditt valg), og gjør import slik som i forrige eksempel.

I tilfelle det ikke finnes tilgjengelige typings, har du to valg: skriv dine egne i en .d.ts-fil, eller ignorer typekontroll for biblioteket.

For å fullstendig ignorere typetesting (dette er ikke den anbefalte måten), importer biblioteket på en variabel av typen any.

 const _: any = require('lodash');

 console.log(_.toUpper('Hello, world !'))

tsc vil klage på at require ikke eksisterer. Gi node-typinger, eller bruk declare for å fjerne feilen.

Svar #3

Du mangler sannsynligvis deklarasjonsfilene.

Se DefinitelyTyped for mer informasjon.

Prøv dette:

npm install --save lodash
npm install --save @types/lodash

Nå kan du importere.

import _ from 'lodash';

Hvis modulen du importerer har flere eksport, kan du gjøre dette:

import { Express, Router } from 'express';

Hvis modulen du importerer «har ingen standardeksport», må du gjøre dette:

import * as http from 'http';

Relaterte artikler