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 lodashog finnes på mitt filsystem (sjekket) - Jeg gjorde også
typings i --save lodash - varianter
import * as _ from 'lodash'ellerconst _=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)
- Opprett en mappe med navnet "typings-custom" i roten av prosjektet ditt
- Referer innholdet i denne mappen i din tsconfig.json:
"include": [
"./typings-custom/**/*.ts"
]
- 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, brukreferencefor å 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ørimportslik 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';
