node.js - Kuinka käyttää npm-moduuleja Typescriptissä?


Yritän TypeScriptiä. Se toimii hienosti hello world -vaiheessa. Yritän nyt käyttää npm-moduulia:

index.ts =

import _ = require('lodash')

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

Tämä ei toimi :

  • tsc index.ts -> Moduulia 'lodash' ei löydy. (2307)
  • node-ts index.js -> Moduulia 'lodash' ei löydy. (2307)

Typescriptin dokumentaation katsominen ja Google ei auttanut. Muut S/O-kysymykset ovat joko vastaamatta (tässä ja tässä) tai eivät liity aiheeseen.

Elementit :

  • typescript 1.8 uusin
  • Kyllä, lodash on asennettu npm i --save lodash ja se on tiedostojärjestelmässäni (tarkistettu)
  • Tein myös typings i --save lodash
  • variantit import * as _ from 'lodash' tai const _=require('lodash') eivät toimi myöskään
  • Yritin muokata tsconfig.json-asetuksia kuten muiden vastausten ehdottamana "moduleResolution": "node" ja "module": "commonjs" kuten joissakin vastauksissa ehdotettiin, mutta se ei silti toimi

Kuinka käytämme npm-pakettia TypeScriptissä??

Vastaus #1

[2018/12] Uusi, ajantasainen vastaus tähän kysymykseen, jonka kysyin vuonna 2016, ja joka silti osoittaa paljon aktiivisuutta, vaikka siinä on vanhentuneita vastauksia.

Lyhyesti sanottuna, TypeScript vaatii tyyppitietoja pakettisi koodista (eli "tyyppideklarointitiedostoja" eli "typings") ja kertoo oikeutetusti, että muuten menetät koko TypeScriptin pointin. Niiden tarjoamiseen tai niistä poikkeamiseen on useita ratkaisuja, jotka on lueteltu tässä parhaiden käytäntöjen mukaisessa järjestyksessä:

Ratkaisu 0: moduuli tarjoaa jo tyyppimääritykset. Jos sen package.json sisältää tällaisen rivin:

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

se on jo TypeScript-yhteensopiva. Todennäköisesti näin ei ole, jos luet tätä sivua, joten jatketaan...

Ratkaisu 1: käytä yhteisön tarjoamia tyypityksiä DefinitelyTypedistä. Modulille "foo" kokeile tätä:

npm add -D @types/foo

jos se toimii, jackpot! Sinulla on nyt tyyppimääritykset ja voit käyttää moduuliasi. Jos npm valittaa, ettei se löydä moduulia @types/foo, jatketaan...

Ratkaisu 2: tarjoa omat tyypitykset tästä moduulista. (mahdollisuus tehdä se vaivatta)

  1. Luo kansio nimeltä "typings-custom" projektisi juureen
  2. Viittaa tämän kansion sisältöön tsconfig.json-tiedostossasi:
"include": [
    "./typings-custom/**/*.ts"
]
  1. Luo tiedosto tällä täsmällisellä nimellä: foo.d.ts [foo=moduulin nimi] sisällöllä:
declare module 'foo'

TypeScript-koodisi pitäisi nyt kääntyä, vaikkakin ILMAN tyyppitietoa (TypeScript pitää foo-moduulia tyypiltään "any").

Voit myös yrittää kirjoittaa tyyppitiedot itse katsomalla virallista dokumentaatiota ja/tai esimerkkejä DefinitelyTypedistä. Jos teet niin, harkitse tyyppiesi lisäämistä joko suoraan moduuliin (ratkaisu 0, jos moduulin tekijä hyväksyy) tai DefinitelyTypediin (ratkaisu 1)

Vastaus #2

[MUOKKAA] Kiitos paljon tästä vastauksesta! Kuitenkin vuoden 2018 jälkeen se on vanhentunut. Lukijat, katsokaa muita vastauksia.

Moduuleja npm:stä on useita tapoja tuoda. Mutta jos et saa tyypityksiä, tsc valittaa aina, ettei se löydä moduulia, jota vaadit (vaikka transponoitu js tosiasiassa toimisi).

  • Jos sinulla on tyypityksiä etkä käytä tsconfig.json-tiedostoa, käytä reference-komentoa tuodaksesi tyypitykset:

    /// <reference path="path/to/typings/typings.d.ts" />
    
    import * as _ from 'lodash`;
    
    console.log(_.toUpper('Hello, world !'))
    
  • Jos käytät tsconfig.json-tiedostoa, varmista, että tyyppitiedostosi on mukana (tai ettei se ole poissuljettu, sinun valintasi), ja tee import kuten edellisessä esimerkissä.

Tapauksessa, jossa saatavilla ei ole tyyppitiedostoja. Sinulla on kaksi vaihtoehtoa: kirjoita omasi .d.ts-tiedostoon, tai ohita tyyppitarkistus kirjastolle.

Täysin tyyppitarkistuksen ohittamiseksi (tämä ei ole suositeltava tapa), tuo kirjasto muuttujalle, jonka tyyppi on any.

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

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

tsc valittaa, että require ei ole olemassa. Tarjoa node-tyypitykset, tai declare se virheen ohittamiseksi.

Vastaus #3

Sinulta puuttuvat todennäköisesti määrittelytiedostot.

Katso lisätietoja DefinitelyTypedistä.

Kokeile tätä:

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

Nyt voit tuoda.

import _ from 'lodash';

Jos moduulissa, jonka tuot, on useita vientiä, voit tehdä näin:

import { Express, Router } from 'express';

Jos tuomaasi moduulilla "eikä ole oletusvientiä", sinun täytyy tehdä näin:

import * as http from 'http';

Aiheeseen liittyviä artikkeleita