Bagaimana cara menggunakan modul npm dari skrip?

91

Saya mencoba naskah ketikan. Ini berfungsi dengan baik di panggung halo dunia. Saya sekarang mencoba menggunakan modul npm:

index.ts =

import _ = require('lodash')

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

Ini tidak berhasil:

  • tsc index.ts -> Cannot find module 'lodash'. (2307)
  • node-ts index.js -> Cannot find module 'lodash'. (2307)

Melihat dokumentasi naskah ketikan dan di google tidak membantu. Pertanyaan S / O lainnya tidak terjawab (di sini dan di sini ) atau tidak terkait.

Elemen:

  • naskah ketikan 1.8 terbaru
  • Ya, lodash diinstal npm i --save lodashdan ada di sistem file saya (dicentang)
  • Saya juga melakukannya typings i --save lodash
  • varian import * as _ from 'lodash'atau const _ = require('lodash')tidak berfungsi juga
  • Saya mencoba mengubah opsi tsconfig.json seperti yang disarankan dalam jawaban lain "moduleResolution": "node"dan "module": "commonjs"seperti yang disarankan dalam beberapa jawaban, masih tidak berfungsi

Bagaimana kita menggunakan paket npm di skrip ketikan ??

Offirmo
sumber
2
Apakah Anda menambahkan referensi ke lodash.d.ts di index.ts Anda? Seharusnya terlihat seperti ini: ///<reference path="../typings/lodash/lodash.d.ts"/>
Granga
@Granga Berhasil. Bisakah Anda menambahkan ini sebagai jawaban?
Offirmo
2
Senang itu berhasil. Blackus telah menambahkan jawabannya dan itu menentukan apa yang saya sarankan dengan lebih baik. Namun satu catatan: Ketika file input ditentukan pada baris perintah (yang merupakan kasus Anda), file tsconfig.json akan diabaikan. ( sumber )
Granga

Jawaban:

61

[EDIT] Terima kasih banyak atas jawaban ini! Namun, pada 2018, itu sudah usang. Pembaca, lihat jawaban lainnya.

Ada beberapa cara untuk mengimpor modul dari npm. Tetapi jika Anda tidak mendapatkan pengetikan, tscakan selalu mengeluh bahwa ia tidak dapat menemukan modul yang Anda perlukan (bahkan jika transpiled js benar-benar berfungsi).

  • Jika Anda memiliki pengetikan dan tidak menggunakan a tsconfig.json, gunakan referenceuntuk mengimpor pengetikan:

    /// <reference path="path/to/typings/typings.d.ts" />
    
    import * as _ from 'lodash`;
    
    console.log(_.toUpper('Hello, world !'))
    
  • Jika Anda menggunakan tsconfig.jsonfile, pastikan untuk memasukkan file ketikan Anda (atau tidak dikecualikan, pilihan Anda), dan buat yang importserupa pada contoh sebelumnya.

Dalam kasus ketika tidak ada pengetikan yang tersedia. Anda memiliki dua pilihan: tulis sendiri pada .d.tsfile, atau abaikan pemeriksaan tipe untuk pustaka.

Untuk sepenuhnya mengabaikan pemeriksaan tipe (ini bukan cara yang disarankan), impor pustaka pada variabel tipe any.

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

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

tscakan mengeluh bahwa requiretidak ada. Berikan nodepengetikan, atau declareuntuk membuang kesalahan.

Blackus
sumber
2
Jawaban lengkap dengan 3 solusi. +1
Offirmo
Tambahan: bahkan bekerja ts-nodeselama indeks pengetikan direferensikan ditsconfig.json
Offirmo
Saya bingung dengan apa yang Anda maksud dengan "menyatakan untuk membuang kesalahan." Apakah saya perlu melakukan perubahan ini pada modul yang saya coba impor?
Siput
1
Jawaban ini sudah sangat ketinggalan zaman. Lihat jawaban baru saya di bawah stackoverflow.com/a/53786892/587407
Offirmo
50

[2018/12] Baru, terkini, jawaban atas pertanyaan yang saya ajukan pada tahun 2016 ini, yang masih memperlihatkan banyak aktivitas meski memiliki jawaban yang ketinggalan zaman.

Singkat cerita, TypeScript membutuhkan informasi tipe tentang kode paket Anda (alias " file deklarasi tipe " alias "typings") dan berhak memberi tahu Anda bahwa jika tidak, Anda akan kehilangan seluruh inti dari TypeScript. Ada beberapa solusi untuk menyediakan atau menyisih dari mereka, tercantum di sini dalam urutan praktik terbaik:


Solusi 0 : modul sudah menyediakan pengetikan. Jika package.json-nya berisi baris seperti ini:

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

itu sudah mendukung TypeScript. Kemungkinan besar tidak demikian jika Anda membaca halaman ini, jadi mari kita lanjutkan ...


Solusi 1 : Gunakan pengetikan kontribusi komunitas dari DefinitelyTyped . Untuk modul "foo", coba ini:

npm add -D @types/foo

jika berhasil, jackpot! Anda sekarang memiliki pengetikan dan dapat menggunakan modul Anda. Jika npm mengeluh tidak dapat menemukan modul @ types / foo, mari lanjutkan ...


Solusi 2 : Berikan pengetikan khusus tentang modul ini. (dengan opsi untuk melakukan tanpa usaha)

  1. Buat folder bernama "typings-custom" di root proyek Anda
  2. Referensi konten folder ini di tsconfig.json Anda:
"include": [
    "./typings-custom/**/*.ts"
]
  1. Buat file dengan nama yang tepat ini: foo.d.ts [foo = nama modul] dengan konten:
declare module 'foo'

Kode TypeScript Anda sekarang harus dikompilasi, meskipun dengan informasi jenis NO (TypeScript mempertimbangkan modul foo jenis "apapun").

Anda juga dapat mencoba menulis informasi jenis sendiri, melihat dokumen resmi dan / atau contoh dari DefinitelyTyped . Jika ya, pikirkan untuk menyumbangkan pengetikan Anda baik langsung ke dalam modul (solusi 0, jika pembuat modul menerimanya) atau ke DefinitelyTyped (solusi 1)

Offirmo
sumber
1
@Offirmo, Kami juga dapat mendeklarasikan beberapa pengetikan kustom dalam satu file juga! Jadi, Tidak perlu banyak file (Mungkin?).
lazycipher
Langkah 2. Reference the content of this folder in your tsconfig.json:memberikan kesalahan berikut: Unknown compiler option 'include'.
Sumit
1
@Sumit ini bukan opsi kompilator, ini harus merupakan saudara daricompilerOptions
Offirmo
22

Anda mungkin kehilangan File Deklarasi .

Lihat DefinitelyTyped untuk info lebih lanjut.


Coba ini:

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

Sekarang Anda dapat mengimpor file.

import _ from 'lodash';

Jika modul yang Anda impor memiliki beberapa ekspor , Anda dapat melakukan ini:

import { Express, Router } from 'express';

Jika modul yang Anda impor "tidak memiliki ekspor default", Anda perlu melakukan ini:

import * as http from 'http';
Derek Soike
sumber
Mengapa kita harus menggunakan * as _dan tidak _ from 'lodash'seperti pada kode ES6?
JohnnyQ
@Poin yang bagus. Menggunakan import _ from 'lodash';lebih baik dalam kasus ini. Saya telah memperbarui jawaban saya untuk menunjukkan berbagai cara mengimpor dan mengapa Anda akan menggunakannya.
Derek Soike
1
The * as _ diperlukan jika modul tidak memiliki ekspor default. Kompilator tsc akan memperingatkan ini.
pengguna2867342
Dengan 'tidak ada ekspor default', apakah itu berarti tidak ada jenis skrip yang ditentukan (yaitu mengimpor modul JavaScript biasa)? Saya baru mengenal JS / Typecript ....
Big Rich
2
@BigRich "Tidak ada ekspor default" berarti modul tidak memiliki export default <...>pernyataan. Lihatlah bagian "Ekspor default" dari Dokumentasi Modul Ketik .
Derek Soike
4

Itu berhasil untuk saya.

  1. Buat folder bernama "typings".
  2. Di folder typings, buat nama file module-name.d.ts . Itu mengandung:

    declare module "module-name";

  3. Di tsconfig.json, lihat foldernya

    "typeRoots": [ "./typings", "../node_modules/@types" ]

Quynh Ngo
sumber
Hai! Terima kasih telah berkontribusi. Metode ini sudah termasuk dalam jawaban saya dan harus digunakan hanya sebagai pilihan terakhir.
Offirmo
Langkah 3 In tsconfig.json, refer to the folder:, memberikan kesalahan berikut:Unknown compiler option 'typesRoots'.
Sumit
1
@ Sumit dalam kasus saya, "typesRoots" ada di dalam "compilerOptions"
Quynh Ngo
1
TypeRoots bukan typesRoots, dan harus ada di dalam compilerOptions
CM
0

Saya telah mendapatkan kesalahan ini dan tidak ada jawaban yang berfungsi untuk saya tetapi saya menemukan sesuatu ketika Anda ingin bekerja dengan modul node dalam skrip, instal sebagai

$npm install @types/<module_name>

sebagai contoh

npm install @types/cheerio

alih-alih mengatakan

npm install cheerio
Crispen Gari
sumber